首页 > 语言 > JavaScript > 正文

AngularJS中的Promise详细介绍及实例代码

2024-05-06 15:05:11
字体:
来源:转载
供稿:网友

Angular中的Promise

在用jQuery的时候就知道 promise 是 Js异步编程模式的一种模式,但是不是很明白他跟JQuery的deferred对象有什么区别。随着公司项目的进行,要跟后台接数据了,所以决定搞定它。

Promise

Promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件。

我们知道,在编写JavaScript异步代码时,callback是最最简单的机制,可是用这种机制的话必须牺牲控制流、异常处理和函数语义化为代价,甚至会让我们掉进出现callback大坑,而promise解决了这个问题。

ES6中Promise、AngularJS内置的AngularJS内置Q,以及when采用的都是Promises/A规范,如下:

每个任务都有三种状态:未完成(pending)、完成(fulfilled)、失败(rejected)。

pending状态:可以过渡到履行或拒绝状态。 fulfilled状态:不能变为其他任何状态,而且状态不能改变,必须有value值。 rejected状态:不能变为其他任何状态,而且状态不能改变,必须有reason。

状态的转移是一次性的,状态一旦变成fulfilled(已完成)或者failed(失败/拒绝),就不能再变了。

function okToGreet(name){  return name === 'Robin Hood';}function asyncGreet(name) {  var deferred = $q.defer();  setTimeout(function() {   // 因为这个异步函数fn在未来的异步执行,我们把代码包装到 $apply 调用中,一边正确的观察到 model 的改变    $scope.$apply(function() {      deferred.notify('About to greet ' + name + '.');      if (okToGreet(name)) {        deferred.resolve('Hello, ' + name + '!');      } else {        deferred.reject('Greeting ' + name + ' is not allowed.');      }    });  }, 1000);  return deferred.promise;}var promise = asyncGreet('Robin Hood');promise.then(function(greeting) {  alert('Success: ' + greeting);}, function(reason) {  alert('Failed: ' + reason);}, function(update) {  alert('Got notification: ' + update);});

  Q Promise的基本用法

上面代码表示, $q.defer() 构建的 deffered 实例的几个方法的作用。如果异步操作成功,则用resolve方法将Promise对象的状态变为“成功”(即从pending变为resolved);如果异步操作失败,则用reject方法将状态变为“失败”(即从pending变为rejected)。最后返回 deferred.promise ,我们就可以链式调用then方法。

JS将要有原生Promise,ES6中已经有Promise对象,firefox和Chrome 32 beta版本已经实现了基本的Promise API

AngularJs中的$q.defferd

通过 调用 $q.defferd 返回deffered对象以链式调用。该对象将Promises/A规范中的三个任务状态通过API关联。

deffered API

deffered 对象的方法

resolve(value):在声明resolve()处,表明promise对象由pending状态转变为resolve。 reject(reason):在声明resolve()处,表明promise对象由pending状态转变为rejected。 notify(value) :在声明notify()处,表明promise对象unfulfilled状态,在resolve或reject之前可以被多次调用。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选