wake-up-neo.com

erwarten ist nur in der asynchronen Funktion gültig

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?

26
j.doe

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();

39
Grégory NEUT

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);
    });
}
3
John Langford

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()
1
Satyam Pathak

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

0
user835611