Warum Async-Await Arbeit mit setState Reagieren?

Ich habe mit async-await mit babel in meinem ReactJS Projekt. Ich entdeckte eine bequeme Nutzung mit setState Reagieren, ich würde es nur gerne besser verstehen. Betrachten Sie diesen code:

handleChange = (e) => {
  this.setState({[e.target.name]: e.target.value})
  console.log('synchronous code')
}

changeAndValidate = async (e) => {
  await this.handleChange(e)
  console.log('asynchronous validation code')
}

componentDidUpdate() {
  console.log('updated component')    
}

Meine Absicht war, für die asynchrone Validierung code ausgeführt werden, nachdem die Komponente aktualisiert hat. Und es funktioniert! Die daraus resultierende console-log zeigt:

synchronous code
updated component
asynchronous validation code

Den Validierungs-code wird nur ausgeführt, nachdem handleChange hat aktualisiert den Zustand und den neuen Zustand wird gerendert.

In der Regel um code auszuführen, nachdem Status aktualisiert hat, Sie hätte ein callback zu verwenden.setState. Das bedeutet, wenn Sie ausführen möchten, alles nach handleChange, müssen Sie geben Sie eine callback-parameter, die dann an setState. Nicht schön. Aber in dem code-Beispiel, irgendwie erwarten weiß, dass handleChange ist abgeschlossen, nachdem der Status aktualisiert hat... Aber ich dachte, warten funktioniert nur mit Versprechungen und wartet auf ein Versprechen zu lösen, bevor Sie fortfahren. Es gibt kein Versprechen und keine Lösung in handleChange... Woher weiß er, was zu warten??

Die Implikation scheint zu sein, dass setState wird asynchron ausgeführt und warten ist irgendwie bewusst, wenn es abgeschlossen ist. Vielleicht setState verwendet verspricht intern?

Versionen:

reagieren: "^15.4.2"

babel-core: "^6.26.0"

babel-preset-env: "^1.6.0",

babel-preset-reagieren: "^6.24.1",

babel-preset-Stadium-0: "^6.24.1"

babel-plugin-system-import-Transformator: "^3.1.0",

babel-plugin-transform-Dekorateure-legacy: "^1.3.4",

babel-plugin-transform-Laufzeit: "^6.23.0"

Der obige code hat eine await auf undefined (weil handleChange nichts zurückgibt). Bist du sicher das es eine Auswirkung auf setState?
welche version von Reagieren und babel verwenden Sie?
das ist seltsam, aber ich bestätigen, erwarten Wirkung. await this.setState({ data: true }, () => console.log('callback')); console.log('inline'); sagt ganz klar callback wird gefeuert zunächst jedoch - entfernen Sie erwarten und arbeitet als Regel setState angenommen, um zu arbeiten - inline ersten und dann callback
scheint richtig zu sein, sollten Sie schalten Sie ihn in eine Antwort wäre es hilfreich für andere, die in der Zukunft als auch dies ist eine ziemlich häufige Suche
Ich möchte gerne eine Ausarbeitung zu. Wird undefiniert zurückgegeben setState asynchron? Es tut immer wieder nach den updates?

InformationsquelleAutor Leo Fabrikant | 2017-10-30

Schreibe einen Kommentar