Ich versuche, zwei Versprechensbibliotheken in derselben Kette zu verwenden. RP ist ein Anforderungsversprechen und dc ist mein eigenes, das prüft, ob die Daten in Ordnung sind.
/*this works fine (checks if date are in correct order)*/
dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.catch(console.log)
/*this also works fine (makes a post request)*/
rp(options)
.then(console.dir)
.catch(console.error)
/*This works up until the rp call, how do I write this chain?*/
dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log).then(rp(options))
.then(console.log)
.catch(console.log);
3 Antworten
Die Funktion then
von Promises übernimmt eine -Funktion . In diesem Codeabschnitt:
dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.then(rp(options))
.then(console.log)
.catch(console.log);
Was Sie mit dem zweiten then
-Aufruf tun, ist die Übergabe einer Funktion , die bereits mit einigen Parametern aufgerufen wurde. Was also tatsächlich an die then
-Funktion übergeben wird, ist das Ergebnis des rp(options)
. Sie bemerken, wie alle console.log
ohne ihre üblichen Klammern verwendet werden? Deshalb.
Die Lösung besteht darin, eine Funktion mit den Daten zu übergeben, an die Sie "gebunden" werden möchten, ohne die Funktion jedoch noch aufzurufen. Der Weg, dies in JavaScript zu tun, wäre:
dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.then(rp.bind(null, options))
.then(console.log)
.catch(console.log);
Die Art rp.bind () "speichert" die Optionen, die zum späteren Aufrufen der rp-Funktion verwendet werden sollen. Der Grund, warum das erste Argument null
ist, ist, dass dies der Parameter ist, der als this
-Variable innerhalb des Funktionsaufrufs verwendet wird und den wir (hoffentlich) nicht wirklich benötigen.
Eine andere Lösung wäre, eine neue anonyme Funktion zu erstellen, deren spezifische Rolle darin besteht, rp
mit options
aufzurufen:
dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.then(function() { return rp(options); })
.then(console.log)
.catch(console.log);
Versuchen
dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.then(function(){ return rp(options);})
.then(console.log)
.catch(console.log);
Promise.then
erwartet function
als Parameter, andernfalls wird es ignoriert, da rp(options);
Promise
zurückzugeben scheint. Der aufgelöste Wert ist nicht von Belang.
Sie sollten eine Funktion verwenden, um sie zu verpacken und das Ergebnis des Aufrufs von rp(options)
zurückzugeben.
Es ist auch erwähnenswert, dass console.log
undefined
zurückgibt. Wenn Sie das Ergebnis von checkIfDateIsAfter
erwarten, sollten Sie dies auch umbrechen und das Ergebnis zurückgeben, damit der Wert dann zum nächsten übergeben werden kann .
dc.checkIfDateIsAfter(departure_date,return_date)
.then(function(res) {
console.log(res);
// Pass the value which would be logged to next chain
// if it'll be used later.
return res;
}).then(function(res) {
// if the rp has anything to do with the value.
rp(options);
})
.then(console.log)
.catch(console.log);