Javascript, пока цикл в асинхронной функции не является асинхронным? - PullRequest
0 голосов
/ 10 февраля 2019

Итак, я попытался сделать что-то вроде этого

async function() {

    while (x) {

    }
    // code
}

Причина, по которой я хочу это сделать, заключается в том, что мне нужно что-то сделать только тогда, когда X становится ложным, и я хочу, чтобы это было в другом потоке, такмой веб-сайт все еще пригоден для использования, и в соответствии с именами и тем, что я читал об этом, асинхронная функция должна быть асинхронной ... Это только естественно, верно?Но вместо этого мое приложение полностью зависает, когда выполняется цикл while.Может кто-нибудь объяснить, почему это происходит и есть ли способ обойти это?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Я просто хотел поделиться тем, как я исправил свою проблему.Возможно, это не самое чистое или правильное решение, но оно сделало то, что я хотел, без проблем с производительностью.

Все, что я хотел, - это создать цикл while, который не прерывал бы мой код и, по крайней мере, кажетсякак будто он работает асинхронно ... и ключевое слово async было не тем, на что я надеялся, и не делает ничего похожего на него.Вместо этого я попробовал это решение, и оно сработало отлично.

setTimeout(function() {
    while (true) {
        if (x) {
            break;
        }
    }
    // code
}, 0);

Кажется, что когда вы набираете 0 для задержки в setTimeout, он выполняет функцию, которую вы передаете ему, только после того, как весь ожидающий код имеетказнены.И так, это заставляет его действовать как асинхронная функция.Он выполнил то, что я хотел, и работает без проблем, так что вот что важно.Если есть более простое решение, пожалуйста, сообщите мне.

Спасибо.

0 голосов
/ 10 февраля 2019

async не означает многопоточность, это просто означает, что вы можете использовать ключевое слово await it it и что значение, возвращаемое этой функцией, гарантированно будет Promise, его результат всегда будет разрешен / отклонен васинхронный способ.

Таким образом, если код в функции async не использует какой-либо другой асинхронный код, он блокирует остальную часть кода так же, как это делает обычная функция.

Если выиспользуйте await в вашем цикле while, тогда другой код, который ожидает, может чередоваться в этой точке.

async function() {

    while (x) {
        // ...
        await someFunction() // at this `await` other code could be executed
        // ...
    }
    // code
}

Так что await в функции async делает две вещи, если правильносторона await - это Обещание, тогда он будет ждать, пока не будет решено (или отклонено), и позволит чередовать другой код, запланированный для выполнения.

...