gpt4 book ai didi

javascript - ES6 Promise block 页面

转载 作者:搜寻专家 更新时间:2023-11-01 05:04:41 27 4
gpt4 key购买 nike

给定以下测试代码:

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");});

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

这是在 Chrome 44 中测试的,根据 this table应全面履行 promise 。

Fiddle here (警告:阻止选项卡)

最佳答案

This code should run asynchronously

是与否,这取决于您所谈论的代码的哪一部分。您的 promise 执行器中的代码(您传递给 new Promise 的函数)异步运行。来自 §25.4.3.1 , 第 10 步:

Let completion be Call(executor, undefined, «resolvingFunctions.[[Resolve]], resolvingFunctions.[[Reject]]»).

请注意,new Promise 没有任何关于异步调用执行程序的内容。 (这是一个“Call”而不是“EnqueueJob”。)

异步保证适用于then,而不适用于new Promise。 ( §25.4.5.3§25.4.5.3.1 。)保证即使 promise 已经解决,您的回调也将不会then 调用同步调用,它会晚于因为它将通过“EnqueueJob”安排。

那么在您的代码中发生的是:

  1. 您调用 new Promise,后者同步调用您的执行器。

  2. 最终执行器返回并且 new Promise 完成,给我们 p

  3. 你调用p.then(...);该调用将作业排队以调用您的回调并立即返回。

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

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

关于javascript - ES6 Promise block 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30391441/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com