javascript - 从 AngularJS 中的链式 .then() 函数返回的 Promise 之间的关系是什么

标签 javascript angularjs promise chain

<分区>

全部:

我对 Promise 很陌生,只是好奇它们是如何解决的,有一件事让我感到困惑:

一些帖子显示使用

var defer = $q.defer();

// some logic block
{
    // if success doing something
    defer.resolve();
}
return defer.promise;

但是如果使用 .then() 函数,promise 是从 .then(function(){}) 返回的,我想知道我如何控制这个 promise 是否已解决?

另一个混淆是:如果我使用一些链接的 .then() 函数,我想知道它们之间的关系是什么,它们是相同的 promise 对象,只是传递下来还是每个 .then 将生成一个新的 Promise 对象并返回它?

最佳答案

如本通篇所述及清楚document :

问题 1.我想知道如何控制此 promise 是否已解决?

其中一个 Promise API 支持 resolve()reject() Promise 的特殊函数。所以你可以在你的代码中使用以下函数

var promise = new Promise(function(resolve, reject) {
  // do a thing, possibly async, then…

  if (/* everything turned out fine */) {
    resolve("Stuff worked!");
  }
  else {
    reject(Error("It broke"));
  }
});

当 promise 被显式拒绝时会发生拒绝,但也会隐式拒绝 如果在构造函数回调中抛出错误。

var jsonPromise = new Promise(function(resolve, reject) {
  // JSON.parse throws an error if you feed it some
  // invalid JSON, so this implicitly rejects:
  resolve(JSON.parse("This ain't JSON"));
});

jsonPromise.then(function(data) {
  // This never happens:
  console.log("It worked!", data);
}).catch(function(err) {
  // Instead, this happens:
  console.log("It failed!", err);
});

在其他变体中,Promise 使用传递到链中下一个链接的返回值来解析。

问题 2.

从某种意义上说,Promise 是会在未来产生一些值(value)的函数。结果值是 promise 的返回值 - 所以基本上 promise 链( .then(...).then... )是等到前一个函数结束(用某个值解析)的函数链。然后用一个参数调用它们,该参数是队列中最后执行的函数的返回值(链中的前一个链接)。

.then() 返回一个新的 promise 对象,从而允许链接。 (文档链接见备注)

备注

official documentation 中有对所有 Angular promise 的详细描述在 Promise API 部分和下一个 - Chaining the promises 下。

关于javascript - 从 AngularJS 中的链式 .then() 函数返回的 Promise 之间的关系是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30406473/

相关文章:

javascript - angularjs 根据模型中的选项数量进行选择

angularjs - ng-动画 : Animation when model changes

javascript - Nodejs 在 Bluebird Promise 中执行 mongodb 命令

javascript - 如何使用 querySelector 查找具有特定类的所有外部链接

javascript - phantomjs 和我的网络浏览器之间的渲染差异

javascript - 如果歌剧 - CSS 有什么不同?

angularjs - 如何在 Protractor e2e 测试中正确单步执行不同页面上的测试?

JavaScript Promises - 创建一组要一起执行的 promise

javascript - 如何检查获取响应以调用另一个获取响应?

javascript - 山魈 Handlebars 示例