Javascript承诺动态回调

Javascript承诺动态回调,javascript,promise,Javascript,Promise,我正在读这篇关于承诺的文章,他在文章中提到了以下几点 “如果承诺成功或失败,并且您稍后添加了成功/失败回调,则将调用正确的回调,即使事件发生在更早的时间” 我不清楚这一点。我在这里的问题是,如果一个承诺已经成功,并且后来我添加了一个回调,那么即使事件发生得更早,这个回调如何执行呢 请解释一下 谢谢 Sahiti如果我正确理解了您的问题,这基本上意味着您可以运行承诺,并在运行后设置回调 在面向事件的编程中,必须首先设置事件回调,否则如果触发,它将永远无法执行正确的回调 使用承诺,您可以运行承诺so

我正在读这篇关于承诺的文章,他在文章中提到了以下几点 “如果承诺成功或失败,并且您稍后添加了成功/失败回调,则将调用正确的回调,即使事件发生在更早的时间”

我不清楚这一点。我在这里的问题是,如果一个承诺已经成功,并且后来我添加了一个回调,那么即使事件发生得更早,这个回调如何执行呢

请解释一下

谢谢
Sahiti

如果我正确理解了您的问题,这基本上意味着您可以运行承诺,并在运行后设置回调

在面向事件的编程中,必须首先设置事件回调,否则如果触发,它将永远无法执行正确的回调


使用承诺,您可以运行承诺
someFunc()
,然后添加回调,而不管承诺在运行时何时实现。

承诺知道它是已解决还是已被拒绝。因此,如果您将另一个事件处理程序附加到它,它将适当地调用它

例如:

function myFunc(){ return Promise.resolve();}

var myPromise = myFunc();
myPromise.then(function(){console.log('I resolved.');});
myPromise.then(function(){console.log('Me too!');});
将导致: 我下定决心。 我也是

当您对一个承诺调用
.then()
时,它有三种可能的操作之一,这取决于该承诺是否已解决、被拒绝或仍处于挂起状态

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

    你能修好这个链接吗?它抛出了一个404 Not Found错误。当你添加回调时,如果承诺已经解决,它会立即自动添加到回调队列中,你是在谈论这个链接吗。有什么需要解释的吗?任何示例代码都会非常有用…因为在承诺完成后,我如何设置回调resolved@user3519495,与未解决问题时的设置方式相同。您是否知道
    Promise.resolve()
    返回已解析的承诺?所以
    Promise.resolve()。然后(()=>console.log(“hi”)
    正在执行您要求的操作。稍后如何添加
    回调
    ?任何示例代码都将非常有用!如果我在
    setTimeout
    中添加
    resolve
    处理程序,但承诺提前兑现,会发生什么?@KevinB,没人!但当我读到这个问题的时候,我的脑海里就出现了这个问题。我希望你不介意回答这个问题。。可以帮助别人……)考虑在事件触发后添加事件侦听器,如果事件不被再次触发,则不会再次调用此事件侦听器。如果要解决的一个动作在它被解析之后被设置,则它将执行。将此事件与事件侦听器进行比较,如果事件已经被触发,事件侦听器将永远不会被调用。这就是我得到的事件与承诺之间的区别。。。在上面的例子中,因为myFunc已经被解析,但是一个动作在以后被设置,所以它显示为:“我也解析了我”…我的理解正确吗