Wenn ich die Antwort von Nick Sotiros vereinfache (was ich großartig finde), ist es meiner Meinung nach am besten zu beschreiben, wie man mit dem Codieren beginnen würde yield
.
Meiner Meinung nach besteht der größte Vorteil der Verwendung yield
darin, dass alle verschachtelten Rückrufprobleme, die wir im Code sehen, beseitigt werden. Es ist schwer zu sehen, wie es zuerst geht, weshalb ich beschlossen habe, diese Antwort zu schreiben (für mich selbst und hoffentlich für andere!)
Die Art und Weise, wie dies geschieht, besteht darin, die Idee einer Co-Routine einzuführen, die eine Funktion ist, die freiwillig anhalten / pausieren kann, bis sie das bekommt, was sie benötigt. In Javascript wird dies mit bezeichnet function*
. Nur function*
Funktionen können verwenden yield
.
Hier ist ein typisches Javascript:
loadFromDB('query', function (err, result) {
// Do something with the result or handle the error
})
Dies ist umständlich, da sich jetzt Ihr gesamter Code (der offensichtlich auf diesen loadFromDB
Anruf warten muss) in diesem hässlich aussehenden Rückruf befinden muss. Das ist aus ein paar Gründen schlecht ...
- Ihr gesamter Code wird eine Ebene in eingerückt
- Sie haben dieses Ziel,
})
das Sie überall im Auge behalten müssen
- All dieser zusätzliche
function (err, result)
Jargon
- Nicht genau klar, dass Sie dies tun, um einen Wert zuzuweisen
result
Auf der anderen Seite kann yield
all dies mit Hilfe des netten Co-Routine-Frameworks in einer Zeile erledigt werden.
function* main() {
var result = yield loadFromDB('query')
}
Und so wird Ihre Hauptfunktion jetzt bei Bedarf nachgeben, wenn sie auf das Laden von Variablen und Dingen warten muss. Um dies auszuführen, müssen Sie jetzt eine normale (Nicht-Coroutine-Funktion) aufrufen . Ein einfaches Co-Routine-Framework kann dieses Problem beheben, sodass Sie nur Folgendes ausführen müssen:
start(main())
Und der Start ist definiert (aus der Antwort von Nick Sotiro)
function start(routine, data) {
result = routine.next(data);
if(!result.done) {
result.value(function(err, data) {
if(err) routine.throw(err); // continue next iteration of routine with an exception
else start(routine, data); // continue next iteration of routine normally
});
}
}
Und jetzt können Sie schönen Code haben, der viel besser lesbar, leicht zu löschen und ohne Einrückungen, Funktionen usw. herumspielen muss.
Eine interessante Beobachtung ist, dass es sich in diesem Beispiel yield
eigentlich nur um ein Schlüsselwort handelt, das Sie einer Funktion mit einem Rückruf vorlegen können.
function* main() {
console.log(yield function(cb) { cb(null, "Hello World") })
}
Würde "Hallo Welt" drucken. Sie können also jede Rückruffunktion tatsächlich verwenden, yield
indem Sie einfach dieselbe Funktionssignatur (ohne cb) erstellen und function (cb) {}
wie folgt zurückkehren :
function yieldAsyncFunc(arg1, arg2) {
return function (cb) {
realAsyncFunc(arg1, arg2, cb)
}
}
Hoffentlich können Sie mit diesem Wissen saubereren, besser lesbaren Code schreiben, der leicht zu löschen ist !