Я написал этот код в 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;
У меня ошибка
"ожидание действует только в асинхронной функции"
В чем проблема?
javascript
node.js
j.doe
источник
источник
await
можно использовать только внутриasync
функции. То естьawait
делает функцию асинхронной, поэтому она должна быть объявлена как таковая.Ответы:
Ошибка относится не к,
myfunction
а кstart
.Я использую возможность этого вопроса , чтобы сообщить вам об известных антипаттернах , используя
await
который:return await
.НЕПРАВИЛЬНО
ВЕРНЫЙ
Также знайте, что есть особый случай, когда
return await
это правильно и важно: (используя try / catch)Есть ли проблемы с производительностью при использовании return await?
источник
start
какasync
функции (хотя некоторые предпочли сделать это в любом случае, для того , чтобы быть более явным)Когда я получил эту ошибку, оказалось, что у меня был вызов функции карты внутри моей функции «async», поэтому это сообщение об ошибке фактически относилось к функции карты, которая не была помечена как «асинхронная». Я обошел эту проблему, взяв вызов «await» из функции карты и придумав другой способ получения ожидаемого поведения.
источник
someArray.map(async (someVariable) => { return await someFunction(someVariable)})
await
вашем коде вводит в заблуждение, потомуArray.map
что не будет обрабатывать функцию как асинхронную функцию. Чтобы быть совершенно ясным, после завершенияmap
функцииsomeFunction
все будут отложены. Если вы действительно хотите дождаться завершения работы функций, вам нужно написать:await Promise.all(someArray.map(someVariable => someFunction(someVariable)))
илиawait Promise.all(someArray.map(someFunction)))
.Для использования
await
контекст его выполнения должен бытьasync
в природеКак уже говорилось, вам нужно прежде всего определить природу вашего
executing context
желания выполнитьawait
задачу.Просто поставьте
async
передfn
объявлением, в которомasync
будет выполняться ваша задача.Объяснение:
В вашем вопросе вы импортируете объект,
method
которыйasynchronous
по своей природе будет выполняться параллельно. Но там, где вы пытаетесь выполнить этотasync
метод, находится внутри другого,execution context
который вам нужно определитьasync
для использованияawait
.Интересно, что происходит под капотом
await
потребляет методы / функции обещания / будущего / возврата задачи иasync
отмечает метод / функцию как способные использовать ожидание.Также, если вы знакомы с
promises
,await
на самом деле выполняет тот же процесс обещания / решения. Создание цепочки обещаний и выполнение следующей задачи вresolve
обратном вызове.Для получения дополнительной информации вы можете обратиться к MDN DOCS .
источник
Текущая реализация
async
/await
поддерживает толькоawait
ключевое слово внутриasync
функций. Изменитеstart
подпись функции, чтобы ее можно было использоватьawait
внутриstart
.Для заинтересованных: предложение для верхнего уровня
await
в настоящее время находится на этапе 2: https://github.com/tc39/proposal-top-level-awaitисточник
async
- это вся суть вasync
.--experimental-repl-await
option.У меня была такая же проблема, и следующий блок кода выдавал такое же сообщение об ошибке:
Проблема в том, что метод getCommit () был асинхронным, но я передавал ему репозиторий аргументов, который также был создан с помощью Promise. Итак, мне пришлось добавить к нему слово async вот так: async (repo), и он начал работать:
источник
async / await - это механизм обработки обещаний, это можно сделать двумя способами
или мы можем использовать await, чтобы дождаться, пока обещание сначала заполнит его, что означает, что оно либо отклонено, либо разрешено.
Теперь, если мы хотим использовать await (ожидание выполнения обещания) внутри функции, обязательно, чтобы функция контейнера была асинхронной функцией, потому что мы ожидаем асинхронного выполнения обещания || имеет смысл правильно ?.
источник
"ожидание действует только в асинхронной функции"
Но почему? 'await' явно превращает асинхронный вызов в синхронный вызов, и, следовательно, вызывающий не может быть асинхронным (или асинхронным) - по крайней мере, не из-за вызова, выполняемого в 'await'.
источник
Да, await / async был отличной концепцией, но реализация полностью нарушена.
По какой-то причине ключевое слово await было реализовано таким образом, что его можно использовать только в рамках асинхронного метода. На самом деле это ошибка, хотя вы не увидите упоминания о ней нигде, кроме как здесь. Исправление этой ошибки заключалось в реализации ключевого слова await таким образом, чтобы его можно было использовать только ДЛЯ ВЫЗОВА асинхронной функции, независимо от того, является ли вызывающая функция синхронной или асинхронной.
Из-за этой ошибки, если вы используете await для вызова реальной асинхронной функции где-то в вашем коде, то ВСЕ ваши функции должны быть помечены как асинхронные, и ВСЕ ваши вызовы функций должны использовать await.
По сути, это означает, что вы должны добавить накладные расходы, связанные с обещаниями, ко всем функциям во всем приложении, большинство из которых не являются и никогда не будут асинхронными.
Если вы действительно думаете об этом, использование await в функции должно требовать функции, содержащей ключевое слово await, чтобы НЕ БЫТЬ ASYNC - это потому, что ключевое слово await собирается приостановить обработку в функции, в которой найдено ключевое слово await. Если обработка в этой функции приостановлена, то она определенно НЕ асинхронна.
Итак, разработчикам javascript и ECMAScript - исправьте реализацию await / async следующим образом ...
источник
async
это отражает тот факт, что многие из ваших функций требуют результатов внешних процессов. На мой взгляд, это совершенно канонично.await
только с вызовами функций: для одного внешнего процесса только одна точка в коде javascript может быть уведомлена, когда этот процесс завершится. Например, если содержимое файла необходимо для трех независимых целей, каждая цель должна будет выполняться независимоlet content = await readTheFile();
- это потому, что нельзя ожидать «обещания содержимого файла», а только «действие чтения файла и возобновления после того, как оно было выполнено. читать".