Javascript Promises-Dynamic Callbacks

时间:2016-04-07 18:47:01

标签: javascript promise

我正在阅读有关承诺http://www.html5rocks.com/en/tutorials/es6/promises/的这篇文章。他在其中提到了以下几点 "如果承诺成功或失败并且您稍后添加了成功/失败回调,则会调用正确的回调,即使事件发生在之前"

我不清楚这一点。我的问题是,如果一个承诺已经成功,后来在某些时候,如果我添加一个回调,即使事件发生在早期,这个回调怎么能执行

请解释

由于 Sahithi

3 个答案:

答案 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()时,根据承诺是否已经解决,被拒绝或仍在等待,它有三个可能的事情之一。

  1. 如果承诺当前正在等待(未解决或拒绝),它可以对传入的.then()处理程序进行排队,以便在实际解决或拒绝承诺时供以后使用。
  2. 可以看到promise已经解决,所以它可以安排传入的resolveHandler在堆栈展开后立即运行
  3. 可以看到承诺已被拒绝,因此它可以安排传入的rejectHandler在堆栈展开后立即运行
  4. 想象一下这个伪代码来说明:

    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(),然后添加回调,无论在运行时何时履行承诺。