ES6 Promise阻止页面

App*_*ell 4 javascript ecmascript-6 es6-promise

鉴于以下测试代码:

var p = new Promise(function(resolve, reject) {
    for(var i=0;i<10000000;++i)
        for(var y=i;y<10000000;++y)
            z = i + y;
    resolve();
});
p.then(function(){alert("resolved");});
Run Code Online (Sandbox Code Playgroud)

此代码应异步运行,但它会阻止与页面的所有交互.为什么?

这是在Chrome 44中测试的,根据此表 Promise应该完全实现.

在这里小提琴(警告:阻止标签)

T.J*_*der 7

此代码应异步运行

是和否,这取决于您所谈论的代码的哪一部分.您的promise执行程序中的代码(您传入的函数new Promise)不是异步运行的.从§25.4.3.1开始,步骤10:

让完成为Call(executor,undefined,«resolvingFunctions.[[Resolve]],resolvingFunctions.[[Reject]]»).

请注意,没有任何关于new Promise异步调用执行程序的信息.(这是一个" 呼叫 "而不是" EnqueueJob ".)

异步保证适用于then,而不是new Promise.(§25.4.5.3§25.4.5.3.1.)保证即使承诺已经解决,你的回叫也不会then呼叫同步调用,它将在之后,因为它将通过" EnqueueJob " 进行调度.

那么代码中会发生什么:

  1. 你打电话new Promise,它同步调用你的执行者.

  2. 最终,遗嘱执行人返回并new Promise完成,给予我们p.

  3. 你打电话p.then(...); 该呼叫将一个作业排队以调用您的回调并立即返回.

  4. JavaScript作业队列中的当前作业将运行完成.

  5. 执行调用回调的作业,调用回调.