所以我尝试做这样的事情
async function() {
while (x) {
}
// code
}
我要这样做的原因是,我只需要在X变为false时才需要做某事,并且希望它在另一个线程中,这样我的网站仍然可以使用,并且根据命名和我读到的内容它,异步函数应该是异步的...这是自然而然的吧? 但是,当while循环运行时,我的应用程序被完全冻结。有人可以解释为什么会发生这种情况,如果有解决办法的话吗?
谢谢。
答案 0 :(得分:2)
async
并不意味着多线程,它只是意味着您可以使用它的await
关键字,并且保证该函数返回的值是Promise,其结果将始终是以异步方式解决/拒绝。
因此,如果async
函数中的代码未使用任何其他异步代码,则它将阻塞其余代码,就像常规函数一样。
如果您在await
循环中使用while
,则其他正在等待的代码可能会在此时插入。
async function() {
while (x) {
// ...
await someFunction() // at this `await` other code could be executed
// ...
}
// code
}
因此await
函数中的async
做两件事,如果await
的右边是一个Promise,则它将等待,直到它解决(或拒绝),然后它将允许计划执行的其他代码进行交织。
答案 1 :(得分:0)
我只想分享解决问题的方式。它可能不是最干净的解决方案,也不是正确的解决方案,但它确实满足了我的期望,而没有任何性能问题。
我只想做一个while循环,它不会中断我的代码,至少看起来像是异步运行的……而async关键字不是我希望的那样,并且什么也没做接近它。相反,我尝试了这种解决方案,效果很好。
setTimeout(function() {
while (true) {
if (x) {
break;
}
}
// code
}, 0);
似乎在setTimeout中为延迟键入0时,它仅在所有未决代码执行完毕后才执行传递给它的函数。因此,它使其像一个异步函数一样工作。它实现了我想要的并且无缝地工作,所以这很重要。如果有更好的简单解决方案,请通知我。
谢谢。