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 tunreturn 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als @jfriend00 erwähnt in Ihrem Kommentar-Diskussionen, dass dies ein dupe ähnliche Fragen immer mit asynchronen Funktionen (
Promise
,Observable
) sollten Sie bubble up die Asynchronität wieder der Anruf und die.then
oder.subscribe
es dort.Rückgabewert mit asynchronen Funktionen in Typescript
Könnten Sie ändern Ihre
saveChanges
undcheckExistence
Funktion in ähnlicher Weise auf dieses:Siehe Beispiel unten und vielleicht bereinigen Ihre Frage zu Beispiel code in einem edit (wenn nicht umschreiben, um ein besseres Beispiel zu der Frage, ich glaube, Sie zumindest möglicherweise lösen Sie Ihr Problem selbst in den Prozess, indem Sie die Zeit, um über Sie gehen sorgfältig wieder)
Gibt es ein paar Probleme mit dem pseudocode, die Sie zur Verfügung gestellt haben, aber ich habe versucht, zu entwerfen, den Prozess so gut ich konnte, während die übrigen treu zu Ihrem ursprünglichen code.
JS:
Als dies in Eckige, würde dies vielleicht damit zusammenhängen Eckige Formen? Asynchrone Validatoren könnten hilfreich sein, um Sie, auch wenn Sie nicht direkt im Zusammenhang
Ähnliche Frage zu Rückgabewert mit asynchronen Funktionen in Typescript und vielleicht viele andere
Ich sehe ähnliche Ungereimtheiten in diesen Arten von Fragen, die verbessert werden könnten durch explizite Eingabe in
TypeScript
um schnellere Rückmeldungen der Dinge, die zum Schutz gegen Dinge, die falsch gehen!Wenn Sie wollen mehr spezifische Hilfe, bitte geben Sie eine überarbeitete version Ihres original-code, da einige Sachen waren, schien schwach ersetzt.
Ansonsten könnten wir uns die Arbeit aus pseudocode mit mehr Klarheit.
Wie dies zu sein scheint eine doppelte Frage, die ähnliche async-Fehler, es ist bis zu Ihnen, um den Kontext, in dem Ihr code nicht funktioniert, sonst umfassende Antworten sind bereits in den anderen Fragen ?.
Fehlersuche Wirren code, es könnte helfen, Sie zu umschreiben, dass der ganze Programmablauf als pseudocode ersten und dann neu erstellen, den code auf dieser Basis zu konsolidieren, was Sie versuchen, zu verstehen. (Dies ist der Grund, warum ich manchmal empfehlen Handschrift Ihres Programms, oder, zumindest, brechen alles in die zugeordneten Variablen, explizit geben alles und machen Sie so viel Gebrauch von der
TypeScript
Sprache service, wie Sie können.Edit: ich sehe, Sie hatten bereits dupliziert Ihre eigene Frage, das ist ein wenig klarer und arbeitet an der Festlegung Ihrer Themen. Ich wünschte, Sie würde habe soeben Ihre Frage an einer Stelle obwohl. Aus den Kommentaren zu anderen Fragen, die Sie scheinen nicht zu wollen, Folgen Sie Anregungen, um die grundlegende asynchrone Verwendungen von
Promise
und wollen immer noch abhängig von einer mutierten Wert noch nicht vorhanden ist (asynchron).