博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈Angular的 $q, defer, promise
阅读量:6649 次
发布时间:2019-06-25

本文共 2606 字,大约阅读时间需要 8 分钟。

转自:

柳絮凭风:

1. $q

$q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常)。

2. defer

defer的字面意思是延迟,$q.defer() 可以创建一个deferred实例(延迟对象实例)。

deferred 实例旨在暴露派生的Promise 实例,以及被用来作为成功完成或未成功完成的信号API,以及当前任务的状态。这听起来好复杂的样子,总结$q, defer, promise三者之间的关系如下所示。

var deferred = $q.defer();  //通过$q服务注册一个延迟对象 deferredvar promise = deferred.promise;  //通过deferred延迟对象,可以得到    一个承诺promise,而promise会返回当前任务的完成结果

defer的方法:

1. deferred.resolve(value)  成功解决(resolve)了其派生的promise。参数value将来会被用作promise.then(successCallback(value){...}, errorCallback(reason){...}, notifyCallback(notify){...})中successCallback函数的参数。2. deferred.reject(reason)  未成功解决其派生的promise。参数reason被用来说明未成功的原因。此时deferred实例的promise对象将会捕获一个任务未成功执行的错误,promise.catch(errorCallback(reason){...})。补充一点,promise.catch(errorCallback)实际上就是promise.then(null, errorCallback)的简写。3. notify(value)  更新promise的执行状态(翻译的不好,原话是provides updates on the status of the promise's execution)

defer的小例子:

function asyncGreet(name) {  var deferred = $q.defer();  //通过$q.defer()创建一个deferred延迟对象,在创建一个deferred实例时,也会创建出来一个派生的promise对象,使用deferred.promise就可以检索到派生的promise。  deferred.notify('About to greet ' + name + '.');  //延迟对象的notify方法。  if (okToGreet(name)) {    deferred.resolve('Hello, ' + name + '!');  //任务被成功执行  } else {    deferred.reject('Greeting ' + name + ' is not allowed.');  //任务未被成功执行  }  return deferred.promise;  //返回deferred实例的promise对象}function okToGreet(name) {  //只是mock数据,实际情况将根据相关业务实现代码  if(name == 'Superman') return true;    else return false;}var promise = asyncGreet('Superman');  //获得promise对象//promise对象的then函数会获得当前任务也就是当前deferred延迟实例的执行状态。它的三个回调函数分别会在resolve(), reject() 和notify()时被执行promise.then(function(greeting) {  alert('Success: ' + greeting);}, function(reason) {  alert('Failed: ' + reason);}, function(update) {  alert('Got notification: ' + update);});

3. promise

当创建一个deferred实例时,promise实例也会被创建。通过deferred.promise就可以检索到deferred派生的promise。

promise的目的是允许interested parties 访问deferred任务完成的结果。

按照CommonJS的约定,promise是一个与对象交互的接口,表示一个动作(action)的结果是异步的,而且在任何给定的时间点上可能或不可能完成。(这句话好绕口,我的理解是promise相当于一个承诺,承诺你这个任务在给定的时间点上可能会完成,也可能完成不了。如果完成了那就相当于resolve, 如果未完成就相当于reject。不知道这样理解对不对?)

promise 的方法:

1. then(successCallback, errorCallback, nitifyCallback) 根据promise被resolve/reject,或将要被resolve/reject,调用successCallback/errorCallback。2. catch(errorCallback)  then(null, errorCallback)的缩写。3. finally(callback, notifyCallback)

补充说明:

promise.then()会返回一个新的衍生promise,形成promise链。例如:promiseB = promiseA.then(function(result) {  return result + 1;});// promiseB will be resolved immediately after promiseA is resolved and its value// will be the result of promiseA incremented by 1

转载地址:http://hsyto.baihongyu.com/

你可能感兴趣的文章
Android与Node.js的http数据交互
查看>>
[LintCode] Container With Most Water
查看>>
MongoDB 笔记【1】
查看>>
为什么「告警等级」对缩短平均修复时间如此重要?
查看>>
ECMAScript 5 新特性 vol.2 - Array
查看>>
jQuery代码组织
查看>>
7大极好的移动应用开发J2ME工具
查看>>
7种JVM垃圾收集器特点,优劣势、及使用场景
查看>>
数字化经济具备的三大特征
查看>>
ZooKeeper分布式架构实战系列(01):ZooKeeper概念、功能、架构、与使用场景和面试题 ...
查看>>
CSS_伪元素_伪类
查看>>
ORACLE中Like与Instr模糊查询性能大比拼
查看>>
【深度分析】汽车零部件供应商管理+采购体系
查看>>
linux 天才排序算法??
查看>>
Java单例设计模式的理解与常规实现方式
查看>>
正则表达式上——基本语法
查看>>
PHPStorm File and Code Template
查看>>
AI技术加速普及喜大普奔?微软CTO认为应持谨慎乐观的态度
查看>>
mysql pxc强一致性集群
查看>>
SpringBoot三部曲之Controller 请求日志切面 AOP
查看>>