Объявить асинхронную функцию / обещание в объекте

#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 .