Используйте ожидание вне асинхронного
Есть ли способ сделать JavaScript await
Ключевая работа вне async
функции? Я хотел бы иметь возможность заморозить весь стек вызовов (а не только остальные async
функция), которая будет возобновлена после того, как конкретное обещание вернет значение. К сожалению мощный await
как это в настоящее время навязано или еще не реализовано. Я пытался заставить nodent.js работать, но из-за моего пользовательского загрузчика и динамических функций это, к сожалению, нецелесообразно.
2 ответа
Учитывая, что вы ищете хак, а не правильное решение для параллелизма на основе обещаний, взгляните на ноды-волокна (есть похожие, но на самом деле это самый популярный вариант с множеством абстракций, построенных вокруг него). Это позволяет вам остановить текущее волокно в любой синхронной функции, пока не произойдет что-то асинхронное, работающее в другом волокне. Что, конечно, ужасная идея, но хорошо...
Есть ли способ заставить работать ключевое слово jaascript await вне асинхронных функций?
К сожалению, ответ: нет.
Смотрите документы:
Выражение await вызывает приостановку выполнения асинхронной функции, ожидание разрешения Promise и возобновление выполнения асинхронной функции после разрешения значения. [выделение добавлено]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
Я хотел бы иметь возможность заморозить весь стек вызовов (а не только остальную часть асинхронной функции), чтобы возобновить его, как только конкретное обещание вернет значение.
Но как ваше обещание могло вернуть значение, если весь стек вызовов был заморожен? Это застряло бы навсегда.
Подробнее
Использовать await
ты должен быть внутри async function
,
По крайней мере, вы должны сделать:
async function main() {
// use await here
}
main();
в вашем основном коде.
Или, используя IIFE - спасибо Роберту Клепу за предложение:
void async function main() {
// use await here
}();
Или, если вам нравится пунктуация:
(async () => {
// use await here
})();
Другие опции
Есть несколько других вариантов обработки параллелизма в Node, например:
- https://www.npmjs.com/package/co
- https://www.npmjs.com/package/bluebird-co
- https://www.npmjs.com/package/async-co
- http://bluebirdjs.com/docs/api/promise.coroutine.html
- http://taskjs.org/
однако ни один из них не зафиксирует стек вызовов, поскольку он будет иметь тот же эффект, что и запуск kill -STOP
с вашим собственным идентификатором процесса и ожиданием остановки остановленного процесса.