Javascript承诺动态回调

Javascript Promises-Dynamic Callbacks

本文关键字:回调 动态 承诺 Javascript      更新时间:2024-02-21

我正在阅读这篇关于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是否已经解决、被拒绝或仍处于挂起状态。

  1. 如果promise当前处于挂起状态(未解析或拒绝),它可以将传入的.then()处理程序排队,以便在promise实际解析或拒绝时使用
  2. 它可以看到promise已经被解析,因此它可以安排传入的resolveHandler在堆栈展开时立即运行
  3. 它可以看到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何时在运行时实现。