如何将一个承诺链接到另一个?

时间:2015-08-20 17:32:00

标签: javascript node.js

我正在尝试在同一个链中使用两个promise库,rp是request-promise,dc是我自己的,它检查日期是否有序。

/*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 个答案:

答案 0 :(得分:1)

Promise.then期望function作为参数,否则会被忽略,因为rp(options);似乎返回Promise,它的解析值不在意。

您应该使用函数来包装它,并从调用rp(options)返回结果。

还值得注意的是console.log返回undefined,如果您期望checkIfDateIsAfter的结果,您还应该包装它,并返回结果,以便值可以通过到那时。

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 :(得分:1)

尝试

 dc.checkIfDateIsAfter(departure_date,return_date)
  .then(console.log)
  .then(function(){ return rp(options);})
  .then(console.log)
  .catch(console.log);

答案 2 :(得分:1)

承诺' then函数通过接受函数来工作。在此代码部分中:

dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.then(rp(options))
.then(console.log)
.catch(console.log);

您在第二次then调用时所执行的操作是传递已使用某些参数调用的函数,因此实际传递的是什么then函数是rp(options)结果。您注意到如果没有通常的括号,所有console.log的使用情况如何?这就是原因。

修复是传递一个包含你想要的数据的函数" bound"对它,但没有调用函数。在JavaScript中执行此操作的方法是:

dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.then(rp.bind(null, options))
.then(console.log)
.catch(console.log);

rp.bind()排序"保存"用于稍后调用rp函数的选项。第一个参数是null的原因是因为这是在函数调用中用作this变量的参数,我们并不真正需要(希望如此)。

另一个解决方法是创建一个新的匿名函数,其特定作用是使用rp调用options

dc.checkIfDateIsAfter(departure_date,return_date)
.then(console.log)
.then(function() { return rp(options); })
.then(console.log)
.catch(console.log);