Winkel-warten Sie Versprechen, Sie zu beheben, bevor Sie fortfahren

Meine folgende code ist Teil der Validierung Teil des Projekts. Der Zweck dieses code ist zu prüfen, ob ein Wert vorhanden ist, in einer Verweistabelle. Wenn nicht vorhanden, dann auf ok, um fortzufahren. Wenn nicht, werfen Fehler und beenden Sie den Benutzer.

saveChanges() {
    //blah blah
    if (needTovalidate){
    passedCheck = false;
    this.validationService.checkExistence(value)
    .then((exist: boolean) => {
      passedCheck = exist;
      console.log("INSIDE: " + exist);

    });
    console.log("OUTSIDE: " + passedCheck);

    if(passedCheck) {
        //Rest of code
    } else {
        //Throw error msg
    }
}


public async checkExistence(value: string): Promise<boolean>{
  var exist = false;
  return this.getRefData().then((rec: dataModel[]) => {
    return rec.some(el => {
      return el.col1 === value;
    });
  });
}

private async getRefData() {
  return await this.configurationService.retrieveTableData().toPromise(); 
}

Erwartet Protokoll:

INSIDE: true
OUTSIDE:true

Eigentlichen Protokoll:

OUTSIDE: false
INSIDE: true

Offensichtlich den code nicht warten, für die Boolesche Versprechen zu beheben, bevor es weiter geht zur nächsten Zeile.

Irgendwelche Vorschläge?

  • Setzen Sie den rest des Codes INNERHALB der .then() handler. Das ist der EINZIGE Ort, der einen booleschen das Versprechen gültig ist. Dies ist eine asynchrone operation. Die .then() - handler aufgerufen wird einigen unbestimmten Zeitpunkt in der Zukunft. Der rest Ihrer Funktion nach der .then() - handler wird ausgeführt, BEVOR das Versprechen endet und bevor die .then() - handler aufgerufen wird. Also, der einzige Ort um das Versprechen, das Ergebnis ist in der .then() handler. Es gibt wahrscheinlich mehr als 1000 weitere Beispiele für die gleiche Art von Frage hier so viele dups wenn Sie möchten, zu suchen.
  • Danke @jfriend00, die ich gesehen habe schon einige Beiträge als gut, aber war nicht sicher, ob mein Fall ist etwas anders durch Zufall...Danke.
  • Es ist nicht anders. Zuweisung eines Wertes, die in einer asynchronen callback zu einer höheren Gültigkeitsbereich von Variablen, so kann man "hoffentlich" uns ist es anderswo, ist fast immer ein Fehler in node.js. Das ist ein grelles Warnsignal, dass Sie tun es falsch. Verwenden Sie den Wert IN der callback-wo Sie es bekommen, oder übergeben Sie es an eine andere Funktion, die Sie aufrufen, die in diesem Rückruf. Das ist, wie Sie das Programm asynchronen code in node.js.
  • Auch return await xxxx() ist eine Verschwendung. Nur tun return xxxx(). Sie sind beide der Rückkehr ein Versprechen, das gelöst werden mit dem entsprechenden Wert. Verwenden Sie .then() auf der zurückgegebenen Versprechen Wert bekommen.
InformationsquelleAutor Henrix | 2018-07-06
Schreibe einen Kommentar