J'ai écrit ce code dans lib/helper.js
var myfunction = async function(x,y) {
....
reutrn [variableA, variableB]
}
exports.myfunction = myfunction;
et puis j'ai essayé de l'utiliser dans un autre fichier
var helper = require('./helper.js');
var start = function(a,b){
....
const result = await helper.myfunction('test','test');
}
exports.start = start;
J'ai une erreur
"wait n'est valide qu'en fonction asynchrone"
Quelle est la solution?
L'erreur ne fait pas référence à myfunction
mais à start
.
async function start() {
....
const result = await helper.myfunction('test', 'test');
}
MODIFIER
// 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();
Lorsque j'ai eu cette erreur, il est apparu que j'avais reçu un appel à la fonction de carte dans ma fonction "asynchrone". Ce message d'erreur faisait donc référence au fait que la fonction de carte n'était pas marquée comme "asynchrone". J'ai résolu ce problème en supprimant l'appel "wait" de la fonction map et en trouvant un autre moyen d'obtenir le comportement attendu.
var myfunction = async function(x,y) {
....
someArray.map(someVariable => { // <- This was the function giving the error
return await someFunction(someVariable);
});
}
Le vrai problème est que vous devez comprendre comment async/wait fonctionne ici . L’erreur est dans votre start function()
Vous devez définir la fonction en tant que fonction Async
pour utiliser await
en tant que
await
utilise des méthodes/fonctions promesses/futures/renvoyant des tâches et
async
marque une méthode/fonction comme étant capable d’attendre.
Await
effectue en fait le même processus de promesse/résolution et comme la fonction est async
, une autre tâche est traitée de manière parallèle
Pour plus d’informations, vous pouvez consulter 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()
L'implémentation actuelle de async
/await
ne prend en charge que le mot clé await
à l'intérieur des fonctions async
. Modifiez votre signature de fonction start
pour pouvoir utiliser await
à l'intérieur de start
.
var start = async function(a, b) {
}
Pour les personnes intéressées, la proposition de await
de niveau supérieur est actuellement à l'étape 2: https://github.com/tc39/proposal-top-level-await