AngularJS(十七)Promise

Promise代表未来将要发生的事件(通常是一个异步操作)。它的好处在于,有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象还提供了一整套完整的接口,使得可以更加容易地控制异步操作。Promise的概念最初被提出是在E语言中,如今已经成为ES6规范之一,取得JavaScript原生支持。Promise作为一个异步操作的结果,主要通过then()方法与其交互,then()方法接收一个回调方法作为参数,这个回调方法接收执行成功的返回值或执行失败的错误原因,错误原因一般是Error对象。需要注意的是,then()方法执行的返回值是一个Promise对象,而then()方法接收回调方法的返回值则可以是任意JavaScript对象,基于这种机制,Promise对象就实现了链式调用效果。

var promise = new Promise(function (resolve, reject) {
    if (/* 异步操作成功 */){
        resolve(value);
    } else {
        reject(error);
    }
});
promise.then(function(value){
    //success
}, function(value) {
    //failure
});

如上所示,Promise构造方法接收一个方法作为参数,该方法具有两个参数,分别为resolve()方法和reject()方法,如果异步操作成功就调用resolve()方法,否则调用reject()方法。Promise实例生成以后,可以使用实例的then()方法分别指定resolve()和reject()方法的回调方法。

1 AngularJS中的Promise机制

主要通过内置的$q服务来实现。

在本例中,控制器中增加了一个add()方法。如果需要让add()方法支持Promise链式调用,需要借助AngularJS的内置服务$q,我们调用$q.defer()获取了一个Deferred对象。Deferred对象的用途是与Promise对象相关联,提供一些API处理成功或失败的任务状态,具有如下方法和属性:
· resolve(value):用于标识当前任务状态成功,可以继续链式调用then()方法。
· reject(reason):用于标识当前任务状态失败,会跳转到catch方法,类似于编程语言中的try……catch语法。
· notify(value):用于更新Promise的执行状态,在Promise被处理或被拒绝之前可能会被调用多次。
· promise - { Promise }:和Deferred对象相关联的Promise对象。

2 AngularJS请求Web服务

AngularJS的Promise机制主要用在和Web应用服务器的通信中。在AngularJS应用中,主要通过XHR和JSONP两种方式向服务端发送HTTP请求。XHR是利用浏览器内置的XMLHttpRequest对象向服务器发送ajax请求。JSONP是一种可以绕过浏览器的安全限制,从不同域请求数据的方法,原理是利用

该标签会向服务器发起HTTP请求,请求路径为GetUserInfo.do,请求参数为UserId=41102,JSONP方式会生成一个

你可能感兴趣的:(AngularJS(十七)Promise)