promise回调是否发送到事件队列?

时间:2016-02-09 18:19:19

标签: javascript jquery promise

请考虑以下代码:

        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

我在想将promise回调发送到Event队列,所以我期待这些结果:

timeout finished
Calling promiseOne
promiseOne done

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

Calling promiseOne
promiseOne done
timeout finished

有人可以向我解释为什么我会得到第一个黑社会?

P.S。用完成替换然后,我得到:

Calling promiseOne
promiseOne done
timeout finished

1 个答案:

答案 0 :(得分:0)

Promises 的jQuery实现不符合ECMASCRIPT ,例如, jQuery promises(实际上)未在下一个事件循环中解析。 jQuery promises将符合即将推出的第三个版本:jQuery.Deferred is now Promises/A+ compatible

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

以回复:

  

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

Promise回调是简单的javascript回调,因此,每个简单的javascript回调,甚至承诺回调都附加到事件循环。