所有
我对Promise很新,只是好奇他们如何得到解决,有一件事让我感到困惑:
有些帖子显示使用
var defer = $q.defer();
// some logic block
{
// if success doing something
defer.resolve();
}
return defer.promise;
但是如果使用.then()函数,则从.then(function(){})返回promise,我想知道如何控制这个promise是否已解决?
另一个令人困惑的是:如果我使用一些链接的.then()函数,我想知道它们之间的关系是什么,它们是相同的承诺对象,只是传递下来或每个。然后将生成一个新的Promise对象并返回它?
答案 0 :(得分:1)
正如本文所述,明确document:
问题1。我想知道如果这个承诺得到解决,我该如何控制呢?
其中一个Promise API支持resolve()
或reject()
承诺的特殊功能。因此,您可以在代码中使用以下函数
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"));
}
});
当承诺被明确拒绝时,也会发生拒绝,但也会隐含 如果在构造函数回调中抛出错误。
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的返回值 - 所以基本上承诺链接(.then(...)。然后...)是等待上一个结束的函数链(用某个值解析)。然后使用参数调用它们,该参数是队列中最后执行的函数的返回值(链中的上一个链接)。
.then()
返回一个新的promise对象,从而允许链接。 (参见文档链接备注)
<强> REMARK 强>
Promise API
部分Chaining the promises
和下一部分<div class="item" ng-click="toogle()"></div>
下的所有Angular承诺都有很好的描述。
答案 1 :(得分:1)
这并不是试图以充分的荣耀来解释承诺 - 有博客就是这样。这是为了回答您的具体问题:
Q1:
但是如果我使用
.then()
函数,则从.then(function(){})
返回promise,我想知道如果这个承诺得到解决,我该如何控制呢?
.then
的解析处理函数控制如何解决此约定:
var thenPromise = originalPromise.then(function success() { return "foo"; }); thenPromise.then(function(data){ console.log(data); // "foo" });
.then
承诺将准确解决新承诺如何解决(或拒绝)var thenPromise = originalPromise.then(function() { return $timeout(function(){ return "foo"; }, 1000); }); thenPromise.then(function(data){ console.log(data); // (after 1 second) "foo" });
var thenPromise = originalPromise.then(function() { return $q.reject("some error"); }); thenPromise.then(function(data){ console.log(data); // doesn't get here }) .catch(function(err){ console.log(err); // "some error" });
<强> Q2:强>
如果我使用一些链式
.then()
函数,我想知道它们之间的关系是什么,它们是相同的promise对象,只是传递下来或每个.then
将生成一个新的Promise对象并返回它?
每个.then
都会产生自己的承诺。
var timeoutPromise = $timeout(afterTimeout, 1000); var thenPromise = timeoutPromise.then(doSomething); var anotherThenPromise = timeoutPromise.then(doSomethingElse);
如果timeoutPromise
结算,那么doSomething
和doSomethingElse
都会执行,并且根据其结果thenPromise
和anotherThenPromise
会有各自的解决方案。