Page 188 - AngularJS权威教程
P. 188
168 第 17 章 promise
第17章
promise
Angular事件系统(我们会在第24章讨论它)给Angular应用提供了很多强大功能。它给我们
的最强大功能之一是promise的自动执行。
17.1 什么是 promise
promise是一种用异步方式处理值(或者非值)的方法。promise是对象,代表了一个函数最
终可能的返回值或者抛出的异常。在与远程对象打交道时,promise会非常有用,可以把它们看
作远程对象的一个代理。
习惯上,JavaScript使用闭包或者回调来响应非同步的有意义的数据,比如页面加载之后的
XHR请求。我们可以跟数据进行交互,就好像它已经返回了一样,而不需要依赖于回调函数的
触发。
回调已经被使用了很长时间,但开发人员用它时都会很痛苦。回调使得调用不一致,得不到
保证,当依赖于其他回调时,它们篡改代码的流程,通常会让调试变得非常难。每一步调用之后,
都需要显式处理错误。
在执行异步方法时触发一个函数,然后期待一个回调能运行起来。与之不同的是,promise
提供了另外一种抽象:这些函数返回promise对象。
例如,在传统的回调代码中,我们可能会有一个方法,用户使用该方法向他的朋友发送数据。
// 示例回调代码
User.get(fromId, {
success: function(err, user) {
if (err) return {error: err};
user.friends.find(toId, function(err, friend) {
if (err) return {error: err};
user.sendMessage(friend, message, callback);
});
},
failure: function(err) {
return {error: err}
}
});
这个回调金字塔已经失控了,而且我们还没有加入健壮的错误处理代码。此外,在被调用的
回调内部,也需要知道参数的顺序。
刚才基于promise版本的代码看上去更接近于: