发表于: 2017-01-15 22:05:10
0 1201
今天完成的事情:
萝卜多:
完成搜索职位页、公司页整理;
找职位页导航,可由导航选择职业及其子类跳转至搜索页;
添加选项卡切换样式;
前台页面基本完成;
学习angular promise
明天计划的事情:
微调前台,开始后台
遇到的问题:
找职业PSD和接口字段不符合,导航没有后端对应接口做不了,纠结了一上午;
访问萝卜多3期网站,找到constans文件查看修改后的约定字段,按照字段构建导航;
收获:
瑞泉碰到关于controller无法获取service里异步请求数据的问题,这个问题之前我也碰上了,但是赶时间没有深究,只将数据请求写入service,controller调用服务后用回调函数取回数据进行处理,过程比较繁琐,数据处理过程也放在controller中,显得臃肿。能否把数据处理过程也放进service中,controller只取最终结果?答案是肯定的--promise:
只放请求;
javascript的运行环境是单线程的,一次只能执行一个任务,但是单线程坏处就是如果前一个任务执行时间较长就会导致整个页面的阻塞,因此javascript提供了异步请求,使任务可以不用等待上一个任务执行完成。但就是这个异步的请求,导致data数据还没返回就已经return数据到控制层了,从而返回值为空,发生错误。
promise:
Deferred定义工作单元,用来定义工作单元的开始,处理和结束三部分
Promise接收Deferred返回的数据。有状态和句柄。Promise 不同于回调的很重要的一个点是,你可以在 Promise 状态变成执行(resolved)之后追加处理句柄。这就允许你传输数据,而忽略它是否已经被应用获取,然后缓存它,等等之类的操作,因此你可以对数据执行操作,而不管它是否已经或者即将可用。在Angularjs使用Promise的时候需要用到内置服务$q;
$q.defer()提供给我们一个创建Deferred对象的方法。这个Deffered对象有个promise属性,这个属性带有6个方法:
resolve(value):用来执行deferred promise,value可以为字符串,对象等。
reject(value):用来拒绝deferred promise,value可以为字符串,对象等。
notify(value):获取deferred promise的执行状态,然后使用这个函数来传递它。
then(successFunc, errorFunc,notifyFunc):无论promise是成功了还是失败了,当结果可用之后,then都会立刻异步调用successFunc,或者'errorFunc',在promise被执行或者拒绝之前,notifyFunc可能会被调用0到多次,以提供过程状态的提示。
catch(errorFunc)
finally(callback)更加形象点。就比如说我现在遇到的这个问题。当我的goodsService请求商品数据的时候,我先用$q.defer()创建了一个deferred对象。然后通过该对象的promise属性获取到一个promise对象。这时我进行数据请求,定义请求成功和请求失败的计划分别是deferred.resolve(data)和deferred.reject()。然后将这个promise返回给请求service的控制层。控制层通过.then创建一个执行链,它允许我们中断基于更多功能的应用流程,可以借此导向不同的的结果,再来进行不同的操作。
所以
可以对数据进行进一步操作
评论