asyncjs
Этот модуль реализует типы и макросы для написания асинхронного кода для JS бэкенда. Он предоставляет инструменты для взаимодействия с JavaScript асинхронным API и библиотеками, написания асинхронных процедур на Nim и преобразования кода на основе обратного вызова в промисы.
Процедура Nim является асинхронной, когда она включает {.async.} пragma. Она всегда должна иметь тип возврата Future[T] или вообще не иметь типа возврата. Тип возврата Future[void] подразумевается по умолчанию.
Это примерно эквивалентно async ключевому слову в коде JavaScript.
proc loadGame(name: string): Future[Game] {.async.} =
# code
должно быть эквивалентно
async function loadGame(name) {
// code
}
Вызов асинхронной процедуры обычно требует await для ожидания завершения Future.
var game = await loadGame(name)
Часто вы можете работать с API на основе обратного вызова. Вы можете обернуть их асинхронными процедурами с использованием промисов и newPromise.
proc loadGame(name: string): Future[Game] =
var promise = newPromise() do (resolve: proc(response: Game)):
cbBasedLoadGame(name) do (game: Game):
resolve(game)
return promise
Вперед объявления работают корректно, вам просто нужно всегда добавить {.async.} пragma:
proc loadGame(name: string): Future[Game] {.async.} Совместимость с JavaScript
Nim в настоящее время генерирует async/await код JavaScript, который поддерживается в современном EcmaScript и большинстве современных версий браузеров, Node.js и Electron. Если вам нужно использовать этот модуль со старыми версиями JavaScript, вы можете использовать инструмент, который делает обратную портирование полученного кода JavaScript, как babel.
Импорты
- jsffi, macros
Типы
Future[T] = ref object future*: T
- Исходный код Редактировать
PromiseJs {...}{.importcpp: "Promise".} = ref object- Исходный код Редактировать
Процедуры
proc newPromise[T](handler: proc (resolve: proc (response: T))): Future[T] {...}{. importcpp: "(new Promise(#))".}- Помощник для обертывания функций на основе обратного вызова в промисы и асинхронные процедуры Исходный код Редактировать
proc newPromise(handler: proc (resolve: proc ())): Future[void] {...}{. importcpp: "(new Promise(#))".}- Помощник для обертывания функций на основе обратного вызова в промисы и асинхронные процедуры Исходный код Редактировать
Макросы
macro async(arg: untyped): untyped
- Макрос, который преобразует обычные процедуры в совместимые с JavaScript асинхронные процедуры Исходный код Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/asyncjs.html