我正在尝试在同一个链中使用两个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);
答案 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);