是发送到事件队列的承诺回调

Are promise callbacks sent to Event queue?

本文关键字:承诺 回调 事件队列      更新时间:2023-09-26

请考虑以下代码:

        function wait(ms) {
            var deferred = $.Deferred();
            setTimeout(deferred.resolve, ms);
            return deferred.promise();
        }
        var starter, promiseOne;
        starter = $.Deferred();
        promiseOne = starter.then(function () {
            console.log("Calling promiseOne");
            return wait(2000);
        }).done(function () {
            console.log('promiseOne done');
        });
        starter.resolve();
        var now=new Date().getTime();
        var stop=now+5000;
        while (stop>new Date().getTime()){}
        console.log('timeout finished');

通过运行它,我得到了以下结果:

Calling promiseOne
timeout finished
promiseOne done

我在想承诺回调被发送到事件队列,所以我期待这些结果:

timeout finished
Calling promiseOne
promiseOne done

如果不发送到事件队列,我希望:

Calling promiseOne
promiseOne done
timeout finished

有人可以向我解释为什么我会得到第一个三合会吗?

附言通过用done替换,我得到:

Calling promiseOne
promiseOne done
timeout finished
Promise 的 jQuery

实现不符合 ECMASCRIPT 标准,例如,jQuery Promise(实际上)不会在下一个事件循环中解析。 jQuery Promises将与即将推出的第三个版本兼容:jQuery.Deferred现在与Promises/A+兼容。

注意:您是否尝试在异步函数中运行starter.resolve()?例如:window.setTimeout(starter.resolve, 0) ;这样做,您的测试用例应该按预期工作。顺便说一下,这不是一个 Promise-bug,而是一个简单的 jQuery-bad-implementation,请记住,jQuery 是在 Promise 规范之前一年诞生

的。

为了回复:

承诺回调会发送到事件队列吗?

promise 回调是简单的 javascript 回调,

因此,当每个简单的 javascript 回调时,甚至 promise 回调都附加到事件循环中。