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);
0
Jonathan Eustace 20 Aug. 2015 im 20:31

3 Antworten

Beste Antwort

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);
1
bawjensen 20 Aug. 2015 im 17:41

Versuchen

 dc.checkIfDateIsAfter(departure_date,return_date)
  .then(console.log)
  .then(function(){ return rp(options);})
  .then(console.log)
  .catch(console.log);
1
vodolaz095 20 Aug. 2015 im 17:37

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);
1
fuyushimoya 20 Aug. 2015 im 17:36