Ожидание действует только в async-функции

Я написал этот код в lib/helper.js

var myfunction = async function(x,y) {
   ....
   reutrn [variableA, variableB]
}
exports.myfunction = myfunction;

а потом я попытался использовать его в другом файле

 var helper = require('./helper.js');   
 var start = function(a,b){
     ....
     const result = await helper.myfunction('test','test');
 }
 exports.start = start;

Я получил ошибку

"Ожидание действует только в асинхронной функции"

В чем проблема?

Ответ 1

Ошибка не myfunction к myfunction но для start.

async function start() {
   ....

   const result = await helper.myfunction('test', 'test');
}

// My function
const myfunction = async function(x, y) {
  return [
    x,
    y,
  ];
}

// Start function
const start = async function(a, b) {
  const result = await myfunction('test', 'test');
  
  console.log(result);
}

// Call start
start();

Ответ 2

Когда я получил эту ошибку, оказалось, что у меня был вызов функции карты внутри моей "асинхронной" функции, поэтому это сообщение об ошибке фактически ссылалось на функцию карты, которая не помечена как "асинхронная". Я обошел эту проблему, приняв "ожидание" вызова из функции карты и придумав другой способ получения ожидаемого поведения.

var myfunction = async function(x,y) {
    ....
    someArray.map(someVariable => { // <- This was the function giving the error
        return await someFunction(someVariable);
    });
}

Ответ 3

Реальная проблема заключается в том, что вам нужно понять, как здесь работает async/await. Ошибка в вашей start function()

Вы должны определить функцию Async функции использовать await, как

await обещаний/будущих/задач-возвращаемых методов/функций и

async отмечает метод/функцию, способные использовать await.

Await на самом деле делает тот же процесс обещать/разрешать, и поскольку функция async выполняет другую задачу параллельно

Для получения дополнительной информации вы можете обратиться в MDN DOCS

async function foo(){

let myAsyncCall = await .... ('/endpoint') // hitting on some api
console.log(myAsyncCall) // myAsyncCall will log out whenever the request get resolved

}

foo()

Ответ 4

Текущая реализация async/await поддерживает только ключевое слово await внутри async функций. Измените сигнатуру функции start чтобы вы могли использовать await внутри start.

 var start = async function(a, b) {

 }

Для тех, кто заинтересован, предложение для await на высшем уровне в настоящее время находится на этапе 2: https://github.com/tc39/proposal-top-level-await