any rets... = Task:await(args...)
Используется для реализации асинхронных функций в стиле синхронных. Первый вызов блокирует текущий кооперативный поток и возвращает ответ полученный во втором вызове.
По факту является аналогом механизма async/await из JavaScript.
Параметр | Описание |
---|---|
args... |
Данные для возврата. |
Значение | Описание |
---|---|
rets... |
Возвращаемые данные. |
function main()
-- Неудобно если таких вложенных вызов очень много.
asyncFunction("World", function(res)
print(res)
asyncFunction("Father", function(res)
print(res)
end)
end)
-- А так гораздо удобнее.
print(asyncFunctionInSyncStyle("World"))
print(asyncFunctionInSyncStyle("Rinat"))
end
-- Якобы асинхронная функция. Здесь мог быть сетевой запрос или чтение файла.
function asyncFunction(req, callback)
Task.create(function()
wait(1000) -- Типо бурная деятельность...
callback("Hello " .. req .. "!")
end)
end
-- Обертка над асинхронной функции.
function asyncFunctionInSyncStyle(req)
-- Получаем текущий кооперативный поток.
local thisTask = Task.this()
-- Проверяем что вызов происходит из корутины.
assert(thisTask, "attempt to yield across C-call boundary")
-- Вызываем нашу асинхронную функцию.
asyncFunction(req, function(res)
-- Возвращаем ответ.
thisTask:await(res)
end)
-- Блокируем текущий кооперативный поток и ждем ответа.
return thisTask:await()
end
Данная функция используетвся всегда в паре, иначе корутина обречена ждать ответа вечно.
Асинхронные функции в стиле синхронных нельзя вызывать из глобальной области скрипта или обратных вызовов событий, только из кооперативных потоков, в частности, функции main
.
Task:status
Перечисление статусов