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应该完全实现.
在这里小提琴(警告:阻止标签)
此代码应异步运行
是和否,这取决于您所谈论的代码的哪一部分.您的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 " 进行调度.
那么代码中会发生什么:
你打电话new Promise,它同步调用你的执行者.
最终,遗嘱执行人返回并new Promise完成,给予我们p.
你打电话p.then(...); 该呼叫将一个作业排队以调用您的回调并立即返回.
JavaScript作业队列中的当前作业将运行完成.
执行调用回调的作业,调用回调.
| 归档时间: |
|
| 查看次数: |
403 次 |
| 最近记录: |