Ожидание действует только в 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