Javascript承诺动态回调
Javascript Promises-Dynamic Callbacks
我正在阅读这篇关于promise的文章http://www.html5rocks.com/en/tutorials/es6/promises/他在信中提到了以下几点"如果承诺成功或失败,并且您稍后添加了成功/失败回调,则会调用正确的回调,即使事件发生在较早的时候"
我不清楚这一点。我的问题是,如果承诺已经成功,稍后如果我添加回调,即使事件发生在之前,该回调如何执行
请解释
谢谢Sahithi
promise知道它是被解决还是被拒绝。因此,如果您将另一个事件处理程序附加到它,它将适当地调用它。
例如:
function myFunc(){ return Promise.resolve();}
var myPromise = myFunc();
myPromise.then(function(){console.log('I resolved.');});
myPromise.then(function(){console.log('Me too!');});
将导致:我下定决心。我也是!
当您对promise调用.then()
时,它有三种可能的事情要做,这取决于该promise是否已经解决、被拒绝或仍处于挂起状态。
- 如果promise当前处于挂起状态(未解析或拒绝),它可以将传入的
.then()
处理程序排队,以便在promise实际解析或拒绝时使用 - 它可以看到promise已经被解析,因此它可以安排传入的resolveHandler在堆栈展开时立即运行
- 它可以看到promise已经被拒绝,因此它可以安排传入的rejectHandler在堆栈展开时立即运行
想象一下这个伪代码来说明:
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
}
如果我正确理解了你的问题,这基本上意味着你可以运行promise,运行后设置回调。
在面向事件的编程中,必须首先设置事件回调,否则,如果被触发,它将永远不会进行正确的回调。
使用promise,您可以运行promise someFunc()
,然后添加回调,而不管promise何时在运行时实现。
相关文章:
- Angular Js 尝试从主按钮回调动态更改模态文本并且不起作用
- Javascript 中的动态回调
- JQuery将字符串识别为函数动态回调
- 谷歌DFP动态广告刷新-是否有回调来确定广告是否已加载
- Javascript承诺动态回调
- 服务回调中的KendoUI网格服务器动态列绑定
- AngularJS - 指令中的动态回调
- 在回调方法中传递动态值
- _googWcmGet回调无法通过具有动态电话号码的GTM工作
- 为动态加载的javascript文件实现“错误”回调
- PassportJS - 动态设置状态以允许在回调时重定向
- ng-repeat之后的Angular JS回调是动态完成的
- 创建带有回调的动态 JSON 数组(内部闭包问题)
- 使用回调在 Chrome 中动态加载样式表
- jQueryUI对话框带有使用回调的动态按钮
- Mootools Request.JSON动态回调
- 如何在动态加载javascript文件后添加回调
- CasperJS不能正确触发动态脚本/链接调用的回调
- 动态脚本hack回调
- 突变观察器没有触发动态变化的回调