Я читал, что асинхронные функции, отмеченные async
ключевым словом, неявно возвращают обещание:
async function getVal(){
return await doSomethingAync();
}
var ret = getVal();
console.log(ret);
но это не согласовано ... при условии, что doSomethingAsync()
возвращается обещание, а ключевое слово await вернет значение из обещания, а не обещание itsef, тогда моя функция getVal должна вернуть это значение, а не неявное обещание.
Так в чем именно дело? Возвращают ли функции, отмеченные ключевым словом async, обещания, или мы контролируем, что они возвращают?
Возможно, если мы не вернем что-то явно, тогда они неявно вернут обещание ...?
Чтобы быть более понятным, есть разница между приведенным выше и
function doSomethingAync(charlie) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(charlie || 'yikes');
}, 100);
})
}
async function getVal(){
var val = await doSomethingAync(); // val is not a promise
console.log(val); // logs 'yikes' or whatever
return val; // but this returns a promise
}
var ret = getVal();
console.log(ret); //logs a promise
В моем синопсисе поведение действительно несовместимо с традиционными операторами возврата. Похоже, что когда вы явно возвращаете значение, не являющееся обещанием, из async
функции, оно принудительно помещает его в обещание. У меня нет большой проблемы с этим, но он бросает вызов обычному JS.
источник
console.log
показывает?Ответы:
Возвращаемое значение всегда будет обещанием. Если вы не вернете обещание явно, возвращаемое вами значение будет автоматически заключено в обещание.
То же самое, даже если есть
await
.Обещает автоматическое развертывание, поэтому, если вы вернете обещание для значения из
async
функции, вы получите обещание для значения (а не обещание для обещания для значения).ES6 имеет функции, которые не возвращают то же значение, что и
return
. Эти функции называются генераторами.источник
Я взглянул на спецификацию и нашел следующую информацию. Краткая версия состоит в том, что
async function
десахарирует генератор, который даетPromise
s. Итак, да, асинхронные функции возвращают обещания .Согласно спецификации tc39 , верно следующее:
Десахар для:
Где
spawn
«вызов следующего алгоритма»:источник
async function
сasync function*
. Первый просто возвращает обещание. Последний возвращает генератор, который дает обещания.Просто добавьте ожидание перед своей функцией, когда вы ее вызываете:
источник
async не возвращает обещание, ключевое слово await ожидает разрешения обещания. async - это усовершенствованная функция генератора, а await работает как yield
Я думаю, что синтаксис (я не уверен на 100%)
async function* getVal() {...}
Функции генератора ES2016 работают примерно так. Я сделал обработчик базы данных, основанный на утомительном, который вы программируете вот так
Обратите внимание, как я просто программирую его как обычный синхронный, особенно на
yield connection.execSql
и вyield connection.callProcedure
Функция db.exec - довольно типичный генератор на основе обещаний.
источник