【转】AngularJS领域中的Promise
Promise是一个接口,它用来处理的对象具有这样的特点:在未来的某一时刻(主要是异步调用)
会从服务端返回或者被填充属性。其核心是,promise是一个带有then()函数的对象。
为了展示它的优点,来看一个例子其中需要获取用户当前的配置文件:
1 var currentProfile=null; 2 var username='something'; 3 fetchServerConfig(function(serverConfig){ 4 fetchUserProfiles(serverConfig.USER_PROFILES,username, 5 function(profiles){ 6 currentProfile=profiles.currentProfile; 7 }); 8 });
上面这种处理方式存在一些问题:
1.对于代码缩进来说,这种代码就是一个噩梦,尤器在需要链式调用很多次的时候。
2.处于回调和函数之间的错误报告非常容易丢失,除非你在每一个步骤中都手动处理错误。
3.如果需要使用currentProfile对象来做一些事情,那么你需要在最内层的回调中封装真正想要
实现的逻辑,要么直接封装,要么通过一个单独的函数来封装。
promise机制可以很好地解决这些问题。在深入了解其运行机制之前,来看看如何使用promise实现
同样的事情:
1 var currentProfile=fetchServerConfig().then(function(serverConfig){ 2 return fetchUserProfiles(serverConfig.USER_PROFILES,username); 3 }).then(function(){ 4 return profiles.currentProfile; 5 },function(err){});
使用promise机制有如下优点:
1.可以对函数进行链式调用,所以你不会陷入代码缩进噩梦中。
2.在调用链的过程中,可以保证上一个函数调用完成后才会调用下一个函数。
3.每一个then()调用都带有两个参数(两个都是函数)。第一个是成功之后的回调,第二个
是出错之后的处理器。
4.如果调用链中出现了错误,错误将会被冒泡传递到其余的错误处理函数中,所以,最终来说
所有错误都可以在任意一个回调函数中进行处理