Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了AngularJS中的服务 -- $q大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

描述

译者注: 看到了一篇非常好的文章,如果你有兴趣,可以查看:Promises与Javascript异步编程,里面对Promises规范和使用情景,好处讲的非常好透彻,个人觉得简单易懂。

既然是用来处理异步编程的,那么在浏览器端的JS里,主要是2种: setTimeout 和 Ajax 请求. promise 的使用就很像Ajax请求的成功和失败回调。

此承诺/延迟(promise/deferred)实现的灵感来自于 Kris Kowal's QCommonJS Promise建议文档将承诺(promise) 作为和 异步执行操作(action)结果对象进行交互的接口,在指定的时间内可能完成也可能不能够完成(如超时,错误,拦截等等)。

错误处理的角度看,延迟(deferred)和承诺(promise) API 对于异步编程来说,和同步编程的try,catch,以及throw作用差不多.

[javascript] view plain copy
  1. //为了演示的目的,此处我们假设`$q`,`scope`以及`okToGreet`引用在当前执行环境中可用
  2. //(比如他们已经被注入,或者被当做参数传进来了).
  3. functionasyncGreet(name){
  4. vardeferred=$q.defer();
  5. setTimeout(function(){
  6. //因为此function在未来的事件循环中异步执行,
  7. //我们需要把代码包装到到一个$apply调用中,以便正确的观察到model的改变
  8. scope.$apply(function(){
  9. deferred.notify('即将问候'+name+'.');
  10. if(okToGreet(name)){
  11. deferred.resolve('你好,'+name+'!');
  12. }else{
  13. deferred.reject('拒绝问候'+name+'.');
  14. }
  15. });
  16. },1000);
  17. returndeferred.promise;
  18. }
  19. varpromise=asyncGreet('小漠漠');
  20. promise.then(function(greeting){
  21. alert('成功:'+greeting);
  22. },function(reason){
  23. alert('失败鸟:'+reason);
  24. },function(update){
  25. alert('收到通知:'+update);
  26. });


引人这种额外的复杂性的效果 在起初可能不明显。 在 promise 和 deferred APIs 进行承诺时好处就看出来了,请参考:https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md
另外 promise api允许那些在传统的回调( CPS )方法中很难的实现的组合。 更多信息请查阅Q文档,特别是 串行与并行的合并一节。

延迟接口 | Deferred API

通过调用 $q.defer() 可以构建一个新的 deffered 实例。
deffered 对象用来将 Promise 实例与 标记任务状态(执行成功还是不成功)的 API 相关联。

deffered 对象的方法

  • resolve(value)——传入 value 解决派生的 promise。 如果 value 是一个通过 $q.reject 构造的拒绝对象(rejection),该promise 将被拒绝。
  • reject(reason)——拒绝派生的promise,并提供原因 。 这相当于通过 $q.reject构造的拒绝对象(rejection)作为参数传递给 resolve。
  • notify(value)——在 promise 执行的过程中提供状态更新。 这在 promise 被解决或拒绝之前可能会被多次调用
  • @H_301_317@

    deffered 对象的属性

    promise – {Promise}—— 与延迟(deferred)相关联的 promise 对象。

    承诺 接口 | Promise API

    当创建 deferred 实例时会创建一个新的 promise 对象,并可以通过 deferred.promise得到该引用。
    promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。

    promise 对象的方法

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

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

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

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

          promise 链 | Chaining promises

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

          [javascript] view plain copy
  1. promiseB=promiseA.then(function(result){
  2. returnresult+1;
  3. });
  4. //promiseB将会在处理完promiseA之后立刻被处理,
  5. //并且其value值是promiseA的结果增加1

大佬总结

以上是大佬教程为你收集整理的AngularJS中的服务 -- $q全部内容,希望文章能够帮你解决AngularJS中的服务 -- $q所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: