Ich habe diesen Code in lib/helper.js
geschrieben.
var myfunction = async function(x,y) {
....
reutrn [variableA, variableB]
}
exports.myfunction = myfunction;
und dann habe ich versucht, es in einer anderen Datei zu verwenden
var helper = require('./helper.js');
var start = function(a,b){
....
const result = await helper.myfunction('test','test');
}
exports.start = start;
Ich habe einen Fehler erhalten
"Erwarten ist nur in der asynchronen Funktion gültig"
Was ist das Problem?
Der Fehler bezieht sich nicht auf myfunction
, sondern auf start
.
async function start() {
....
const result = await helper.myfunction('test', 'test');
}
EDIT
// 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();
Als ich diesen Fehler erhielt, stellte sich heraus, dass die Map-Funktion in meiner "async" -Funktion aufgerufen wurde. Diese Fehlermeldung bezog sich also darauf, dass die map-Funktion nicht als "async" markiert wurde. Ich bin um dieses Problem herumgekommen, indem ich den "Erwarten" -Aufruf aus der Map-Funktion genommen und einen anderen Weg gefunden habe, um das erwartete Verhalten zu erhalten.
var myfunction = async function(x,y) {
....
someArray.map(someVariable => { // <- This was the function giving the error
return await someFunction(someVariable);
});
}
Das eigentliche Problem ist, dass Sie wissen müssen, wie async/await hier arbeitet. Der Fehler liegt in Ihrer start function()
Sie müssen eine Funktion als Async
-Funktion definieren, um await
als verwenden zu können
await
verbraucht Methoden/Funktionen von Versprechen/Zukunft/Aufgabenrückgabe und
async
kennzeichnet eine Methode/Funktion als befähigt, wait zu verwenden.
Await
führt tatsächlich den gleichen Prozess des Versprechens/Auflösens aus, und da die Funktion async
ist, wird die andere Task parallel verarbeitet
Weitere Informationen finden Sie in 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()
Die aktuelle Implementierung von async
/await
unterstützt nur das await
-Schlüsselwort in async
-Funktionen. Ändern Sie die Signatur der start
-Funktion, sodass Sie await
in start
verwenden können.
var start = async function(a, b) {
}
Für Interessenten befindet sich der Vorschlag für die oberste Ebene await
derzeit in Stufe 2: https://github.com/tc39/proposal-top-level-await