Есть ли способ заставить ключевое слово javascript await
работать вне функций async
? Я хотел бы иметь возможность заморозить весь стек вызовов (а не только остальную часть функции async
), чтобы возобновить его, когда конкретное обещание вернет значение. К сожалению, мощный await
, подобный этому, в настоящее время gimped или еще не реализован. Я попытался сделать nodent.js работать, но из-за моего пользовательского загрузчика и динамических функций это, к сожалению, непрактично.
Использовать ждут вне async
Ответ 1
Учитывая, что вы ищете взломать, а не соответствующее обещание concurrency, посмотрите node-fibers ( есть похожие, но afaik это самый популярный, с множеством абстракций, построенных вокруг него). Это позволяет вам останавливать текущее волокно в любой синхронной функции, пока не произойдет что-то асинхронное, которое выполняется в другом волокне. Что, конечно, - ужасная идея, но хорошо...
Ответ 2
Есть ли способ заставить javascript ожидать ключевое слово за пределами асинхронных функций?
К сожалению, ответ таков: Нет.
Смотрите документы:
Ожидающее выражение вызывает выполнение функции асинхронной паузы, чтобы дождаться разрешения Promise и возобновить выполнение функции асинхронной работы, когда значение будет разрешено. [выделено мной]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
Я хотел бы иметь возможность заморозить весь стек вызовов (а не только оставшуюся часть функции async), чтобы возобновиться, как только конкретное обещание вернет значение.
Но как ваше обещание могло бы вернуть значение, если весь стек вызовов был заморожен? Он будет застрять навсегда.
Подробнее
Чтобы использовать await
, вы должны находиться внутри async function
.
По крайней мере, вам нужно сделать:
async function main() {
// use await here
}
main();
в вашем основном коде.
Или, используя IIFE - благодаря Роберту Клепу за предложение:
void async function main() {
// use await here
}();
Или, если вам нравится пунктуация:
(async () => {
// use await here
})();
Другие опции
Есть и другие опции для обработки concurrency в 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
с вашим собственным идентификатором процесса и ожидание остановки процесса.