不过 ng 的这套机制总的来说实现得比较简单,按官方的说法,够用了。



    使用的方法,基本上是:



    • 通过 deferred 实例的 promise 属性得到一个 promise 对象

    • promise 对象负责定义回调函数

    • deferred 实例负责触发回调


    了解了上面的东西,再分别看 $qdeferredpromise 这三个东西。



    • $q.defer() 返回一个 deferred 对象

    • $q.reject() 包装一个错误,以使回调链能正确处理下去

    • $q.when() 返回一个 promise 对象


    $q.all() 方法适用于并发场景很合适:


      $q.reject() 方法是在你捕捉异常之后,又要把这个异常在回调链中传下去时使用:



      要理解这东西,先看看 promise 的链式回调是如何运作的,看下面两段代码的区别:

      1. var defer = $q.defer();
        var p = defer.promise;
        var p2 = p.then(
        function(data){return 'xxx'}
        );
        p2.then(
        function(data){console.log(data)}
        );
        defer.resolve('123');


      $q.reject() 的作用就是触发后链的 error 回调:


      最后的 $q.when() 是把数据封装成 promise 对象:

      1. var p = $q.when(0, function(data){return data},
        function(data){return data});
        p.then(
        function(data){console.log('ok, ' + data)},
        function(data){console.log('error, ' + data)}
        );


      deferred 对象有两个方法一个属性。


      • promise 属性就是返回一个 promise 对象的。


      • reject() 失败回调