#javascript #async-await #es6-promise
#javascript #асинхронный -ожидание #es6-обещание
Вопрос:
У меня есть функция, которая возвращает объект с «экспортированными» функциями. В этих экспортируемых функциях я хочу использовать обещания.
var DATABASE = (function () {
var exports = {};
exports.query = function(filter = {}) {
return true;
}
return exports;
}());
console.log(DATABASE.query());
Я попытался сделать эту функцию асинхронной. Но я получаю базу ДАННЫХ.запрос не является функцией.
var DATABASE = (async function () {
var exports = {};
exports.query = await function(filter = {}) {
return true;
}
return exports;
}());
console.log(DATABASE.query());
Я попробовал это с помощью promises, и кажется, что это работает, но я думаю, что await / async — лучшее кодирование.
var DATABASE = (function () {
var exports = {};
exports.query = function(filter = {}) {
return new Promise(function(resolve, reject) {
resolve(true);
});
}
return exports;
}());
DATABASE.query().then(function(result) {
console.log(result);
});
Можете ли вы помочь мне преобразовать это в async / await?
Комментарии:
1. Если IIFE является
async
функцией, тоDATABASE
это обещание объекта. В этом случае нет смыслаasync
, потомуawait function() { ... }
что это не имеет никакого смысла; этоquery
функция, которая должна бытьasync
.2. можете ли вы объяснить немного больше? Возможно ли использовать его в режиме ожидания?
3. Ввод
async
определения функции заставляет ее возвращать обещание. Итак, посмотрите, что вы сделали с вашимDATABASE
4. Если вы хотите сделать
query
асинхронным, то вам не следуетawait
назначать его при экспорте.exports.query = async() => { await blah(); return true; }
5. Возможно ли это? ДА. Но то, как вы это делаете, не имеет смысла.
async
функции всегда возвращают обещания, нет необходимости, чтобы IIFE былasync
функцией.
Ответ №1:
Вам нужно сделать свой query
метод асинхронным, а не IIFE, используемым (без необходимости) для шаблона модуля:
const DATABASE = (function () {
const exports = {};
exports.query = async function(filter = {}) {
// ^^^^^
return true;
};
return exports;
}());
console.log(DATABASE.query());
Комментарии:
1. но при этом я получаю обещание, возвращающее не значение true.
2.Но вы хотели
query
вернуть обещание, не так ли? Конечно, чтобы записать результат вместо обещания, вы бы использовалиDATABASE.query().then(console.log)
илиconsole.log(await DATABASE.query())
, но из демонстрации в вашем вопросе вы, похоже, уже знали это.3. Да, но await не сработал, похоже, await не работает в глобальной области. Так что только тогда () было бы невозможно.
4. ДА. Не имеет значения для реализации
query
though .