异步功能中的JavaScript while循环是否异步?

时间:2019-02-10 10:53:47

标签: javascript function asynchronous ecmascript-7

所以我尝试做这样的事情

async function() {

    while (x) {

    }
    // code
}

我要这样做的原因是,我只需要在X变为false时才需要做某事,并且希望它在另一个线程中,这样我的网站仍然可以使用,并且根据命名和我读到的内容它,异步函数应该是异步的...这是自然而然的吧? 但是,当while循环运行时,我的应用程序被完全冻结。有人可以解释为什么会发生这种情况,如果有解决办法的话吗?

谢谢。

2 个答案:

答案 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时,它仅在所有未决代码执行完毕后才执行传递给它的函数。因此,它使其像一个异步函数一样工作。它实现了我想要的并且无缝地工作,所以这很重要。如果有更好的简单解决方案,请通知我。

谢谢。