全部:
我对 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
下。