javascript - 为什么将代码包装在resolved prop 中会使同步代码表现得像异步代码?

标签 javascript loops for-loop promise es6-promise

promise 内部的循环就像同步代码一样工作,例如:


console.log('im working')
function proLoop(){
    return Promise((resolve ,rejects)=>{
        for (let i = 0; i < 1000000000000; i++) {}
        console.log('loop is done')
    })
}

proLoop();

console.log('im working')

因此,即使我们编写的内容类似于 Promise,它也会获得更多时间并卡住我们的代码。换句话说,它将同步工作。

我找到了一个解决方案,但为什么它有效?

所以解决方案只是像已解决的 promise 一样扭曲您的代码

像这样

return new Promise.resolve().then( ()=>{
    for (let i = 0; i < 1000000000000; i++) {}
    console.log('loop is done')
})

但是为什么以及如何???

最佳答案

这里您需要了解一些事情:

  1. Promise 不会使某些东西异步 - 它们是已经异步的东西的通知机制。 Promise 会通知您已经异步操作的成功或失败。

    promise构造函数的回调函数同步调用;它被同步调用以启动已经异步的操作。

    在您的情况下,promise 构造函数包含同步代码;这就是它阻止其他代码的原因。

  2. 将循环移至 then 的回调函数内会异步执行循环,因为 then 的回调函数是异步调用的。

    注意:尽管then方法的回调函数是异步调用的,但一旦开始执行,在回调内的同步代码执行完毕之前,不会再执行其他代码。

关于javascript - 为什么将代码包装在resolved prop 中会使同步代码表现得像异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71261653/

相关文章:

c# - 有没有办法在 for 循环 C# 中使用 orderby?

c - 在 for 循环中向数组添加元素

javascript - 更改 $scope 属性并观察变化

javascript - 防止可编辑 div 在输入某些字符时的行为

php - 从 PHP 中的下一个 foreach 项目中提取元素?

java - 将数组返回到 main 方法

sql - 如何计算多个数组中的条目数

javascript - 模态是 bootstrap4 alpha6 模态的转换错误

javascript - 查找 Azure Bing 新闻的 Ocp-Apim-Subscription-Key 时遇到问题

Perl 编程 : continue block