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')
})
但是为什么以及如何???
最佳答案
这里您需要了解一些事情:
Promise 不会使某些东西异步 - 它们是已经异步的东西的通知机制。 Promise 会通知您已经异步操作的成功或失败。
promise构造函数的回调函数同步调用;它被同步调用以启动已经异步的操作。
在您的情况下,promise 构造函数包含同步代码;这就是它阻止其他代码的原因。
将循环移至
then
的回调函数内会异步执行循环,因为then
的回调函数是异步调用的。注意:尽管
then
方法的回调函数是异步调用的,但一旦开始执行,在回调内的同步代码执行完毕之前,不会再执行其他代码。
关于javascript - 为什么将代码包装在resolved prop 中会使同步代码表现得像异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71261653/