caoruiy‘s blog

Wisdom outweighs any wealth

Angular-API-service-$q

原文地址:/ API Reference / ng / service components in ng / $q

一种可以帮助您异步运行功能的服务,并在完成处理后使用它们的返回值(或异常)。

$ q可以用两种方式使用 – 一种类似于Kris Kowal的Q或者jQuery的Deferred实现,另一种类似ES6(ES2015)在某种程度上是承诺的。

$q constructor

类似于ES6 Promise的使用方法:
app.controller('first',['$q',function($q){
    function q(isTrue){
        return $q(function(reslove, reject){
            if(isTrue){
                reslove('inslove');
            }else{
                reject('inject');
            }
        });
    }

    q(false).then(function(data){
        console.log(data)
    },function(data){
        console.log(data)
    });
}])

  1. progress/notify 回调目前不支持通过ES6风格的界面。
  2. 与ES6行为不同,构造函数中抛出的异常将不会隐式inject promise

当然,也支持更为传统的commonJS的调用方式。commonJS 的 promise 定义提案将promise描述为与 [表示异步动作结果的对象] 进行交互的界面,并且可能在任何给定时间点完成或不完成。

app.controller('first',['$q',function($q){
    function q(isTrue){
        var defer = $q.defer();
        defer.notify('abc');

        if(isTrue){
            defer.reslove('inslove');
        }else{
            defer.reject('inject');
        }
        return defer.promise;

    }

    q(false).then(function(data){
        console.log(data)
    },function(data){
        console.log(data)
    },function(data){
        console.log(data)
    });
}])

The Deferred API

一个新的deferred实例通过调用$q.defer()来构造。

延迟对象的目的是公开相关的Promise实例以及可用于指示成功或不成功,以及任务状态的API。

Methods
  • resolve(value) : 使用该值解析派生的promise。如果该值是通过$ q.reject构造的拒绝,则承诺将被拒绝。
  • reject(reason) : 拒绝原因的衍生承诺。这相当于通过$q.reject构造的拒绝来解决它。
  • notify(value) : 提供有关承诺执行状态的更新。在承诺解决或拒绝之前,这可能会被多次调用。
Properties
  • promise : 与此defered相关的promise对象。

The Promise API

defer()

创建Deferred对象,代表将来会完成的任务。

promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

Methods
  • then(successCallback, errorCallback, notifyCallback) :

    不管 promise 是被处理还是被拒绝, 一旦结果可用,then 就会尽快地异步调用 成功/错误 回调函数 只要结果是可用的。 调用回调函数时传递单个参数: 结果 或拒绝的理由。 此外,notify 回调可能被调用 0到多次,以提供 提供一个进度指示,之前承诺解决或拒绝。

    这个方法 返回一个新的promise 对象, 根据 successCallback , errorCallback的返回值进行解决或拒绝 。 它还通过 notifyCallback 方法的返回值进行通知。 promise 不能从notifyCallback方法得到解决或拒绝 。

  • catch(errorCallback) : promise.then(null, errorCallback) 的快捷方式
  • finally(callback) :

    让你可以观察到一个 promise 是被执行还是被拒绝, 但这样做不用修改最后的 value值。 这可以用来做一些释放资源或者清理无用对象的工作,不管promise 被拒绝还是解决。 更多的信息请参阅完整文档规范.

    因为在 ES3版本的JavaScript中 finally 是一个保留字关键字,不能作为属性名,为了适配 IE8,您需要使用 promise[’finally’](callback) 这种形式来调用该方法。

Chaining promises

因为调用一个 promise 的 then 方法返回一个新的派生 promise实例,所以构建promises链也是很容易的:

promiseB = promiseA.then(function(result) {  
  return result + 1;  
});

我们可以创建任意长度的promise链;因为一个promise可以被另一个promises处理(进一步推迟解决完成时间),所以在promise链上的任意一点进行 暂停/推迟解决 都是可行的。 这使得实现功能强大的APIs 成为现实,例如 $http 的响应拦截器。

reject(reason)

创建一个指定拒绝原因的promise. 此api应该用于在一个promises链中进行拒绝。 如果你正在处理promise 链中的最后一个promise,你不需要担心。

把 deferreds/promises 与我们熟悉的的 try/catch/throw行为进行对比,可以认为 reject 相当于 JavaScript 中的throw 关键字。 这也意味着如果你通过一个 promise 的 error回调, “catch”了一个错误 ,你想要指明当前的承诺已经执行出错了,就必须重新抛出一个“附带了错误信息,拒绝通过的reject” 。

when(value, [successCallback], [errorCallback], [progressCallback])

将一个对象(可能是value 或 [第三方]then-able promise) 包装为一个 $q promise。 这在你不确定所处理的对象是否是一个promise 时是很有用的,有可能该对象来自于一个不被信任的源头。

$q.when(false,function(data){
        console.log('reslove:'+data)
    },function(data){
        console.log('reject:'+data)
    },function(data){
        console.log(data)
    });

如果value是一个值,他将始终当作reslove处理,如果是promise对象,则按照相应的返回值处理。

resolve(value, [successCallback], [errorCallback], [progressCallback]);

when方法的别名,保持与ES6的命名一致性。

all(promises)

结合多个promises为单个promise,在所有输入的promise都处理之后,组合之后的promise才会处理完成。

更多

其他翻译

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注