我正在阅读有关承诺http://www.html5rocks.com/en/tutorials/es6/promises/的这篇文章。他在其中提到了以下几点 "如果承诺成功或失败并且您稍后添加了成功/失败回调,则会调用正确的回调,即使事件发生在之前"
我不清楚这一点。我的问题是,如果一个承诺已经成功,后来在某些时候,如果我添加一个回调,即使事件发生在早期,这个回调怎么能执行
请解释
由于 Sahithi
答案 0 :(得分:1)
承诺知道它是被解决还是被拒绝。因此,如果您为其附加另一个事件处理程序,它将适当地调用它。
例如:
function myFunc(){ return Promise.resolve();}
var myPromise = myFunc();
myPromise.then(function(){console.log('I resolved.');});
myPromise.then(function(){console.log('Me too!');});
会导致: 我解决了 我也是!
答案 1 :(得分:0)
当您在承诺上致电.then()
时,根据承诺是否已经解决,被拒绝或仍在等待,它有三个可能的事情之一。
.then()
处理程序进行排队,以便在实际解决或拒绝承诺时供以后使用。想象一下这个伪代码来说明:
Promise.prototype.then = function(resolveHandler, rejectHandler) {
var self = this;
if (this._promiseState === "pending") {
// promise is not yet resolved or rejected so
// just queue the .then handlers for later use
this._handlers.push({resolve: resolvehandler, reject: rejectHandler});
} else if (this._promiseState === "resolved") {
// already resolved, schedule the resolve handler to run
// immediately after stack unwinds
if (resolveHandler) {
setImmediate(function() {
var p = resolveHandler(self._resolvedValue);
// further processing
});
}
} else {
// already rejected, schedule the reject handler to run
// immediately after stack unwindws
if (rejectHandler) {
setImmediate(function() {
var p = rejectHandler(self._rejectReason);
// further processing
});
}
}
// more code here that eventually returns a new promise
}
答案 2 :(得分:-1)
如果我理解你的问题,这基本上意味着你可以运行一个承诺,在运行它之后,设置回调。
在面向事件的编程中,您必须首先设置事件回调,否则如果触发它将永远不会进行正确的回调。
使用promises,您可以运行promise someFunc()
,然后添加回调,无论在运行时何时履行承诺。