Die Callbacks, die überall in JavaScript zu sehen sind, sind eine Katastrophe für die Prozesssteuerung, und die Mängel liegen auf der Hand:
1. Ohne eine explizite Rückgabe kann es leicht zu redundanten Prozessen und den daraus resultierenden Fehlern kommen.
2. Der Code ist unendlich verschachtelt und schwer zu lesen.
Lassen Sie uns darüber sprechen, wie Sie die oben genannten Probleme lösen und vermeiden können.
Das erste Problem ist eine Gewohnheitssache. Dies gilt insbesondere bei der Verwendung von Coffee-Script (obwohl es das Endergebnis selbst erfasst, wenn es in Javascript kompiliert wird). wird als Rückgabewert verwendet, dieser Rückgabewert stellt jedoch nicht unbedingt Ihre ursprüngliche Absicht dar). Schauen Sie sich das Beispiel unten an.
b = ->
console.log 'Ich bin ein Rückruf'
a('Fehler', b)
Bei diesem sogenannten „Fehler zuerst“-Codierungsstil möchten wir natürlich nicht, dass der nachfolgende Code in Methode a weiterhin ausgeführt wird, wenn ein Fehler auftritt, aber wir möchten nicht werfen, um den gesamten Prozess auszuführen hängen (es muss anmutig sein, auch wenn es passiert) Verdammt ~), dann erzeugt der obige Code Fehler.
Eine Lösung besteht darin, ehrlich gesagt if...else... zu schreiben, aber ich bevorzuge den folgenden Ansatz:
b = ->
console.log 'Ich bin ein Rückruf'
a('Fehler', b)
Die meisten Rückgabewerte in asynchronen JavaScript-Methoden sind nutzlos, daher wird return hier als Prozesssteuerung verwendet, was weniger Code als if...else..., aber klarer ist.
Das zweite Problem entsteht im Mutterleib und ist schwer zu beseitigen.
Eine gute Möglichkeit besteht darin, einige Flusskontrollmodule zu verwenden, um den Code besser zu organisieren. Async ist beispielsweise ein gutes Modul, das eine Reihe von Schnittstellen bereitstellt, einschließlich Iteration, Schleife und einigen bedingten Anweisungen, und sogar A-Warteschlangen umfasst System. Die folgenden Beispiele können die Vor- und Nachteile der beiden Schreibmethoden verdeutlichen
first = (callback)->
console.log 'Ich bin die erste Funktion'
Rückruf()
Sekunde = (Rückruf)->
console.log 'Ich bin die zweite Funktion'
Rückruf()
dritter = ()->
console.log 'Ich bin die dritte Funktion'
zuerst ->
Sekunde ->
dritter()
# asynchron verwenden
async = require('async')
async.waterfall [
zuerst
zweitens
dritter
], (ähm)->
Welches wirst du als weiser Mensch wählen?