Javascript 将简单函数直接传递给es6 promise。然后

Javascript 将简单函数直接传递给es6 promise。然后,javascript,callback,es6-promise,Javascript,Callback,Es6 Promise,我在express route函数中有以下ES6承诺链(即res是express response对象)。findQnameForId是一个承诺,mongoDelete和mysqlDelete都是返回承诺。当我使用注释掉的代码而不是当前的最后一行代码时,该链起作用,但我的问题是,为什么我不能直接将res.send传递到然后(如图所示),然后让它将结果返回给客户端 findQnameForId .then(mongoDelete) .then(mysqlDelete) .then(res.send

我在express route函数中有以下ES6承诺链(即res是express response对象)。findQnameForId是一个承诺,mongoDelete和mysqlDelete都是返回承诺。当我使用注释掉的代码而不是当前的最后一行代码时,该链起作用,但我的问题是,为什么我不能直接将res.send传递到
然后
(如图所示),然后让它将结果返回给客户端

findQnameForId
.then(mongoDelete)
.then(mysqlDelete)
.then(res.send, res.status(400).send);
// .then(function(result) {
//  res.send(result);
// })
// .catch(function(err) {
//  res.status(400).send(err);
// });

我认为这与回调期间没有正确的
值有关。它可能与
bind
一起工作:

var fourhundred = res.status(400);
findQnameForId
.then(mongoDelete)
.then(mysqlDelete)
.then(res.send.bind(res), fourhundred.send.bind(fourhundred));
…但请继续阅读

如果您确实知道
res.status(400)
返回
res
,那么它就简单了一点:

findQnameForId
.then(mongoDelete)
.then(mysqlDelete)
.then(res.send.bind(res), res.status(400).send.bind(res));
…但请继续阅读

请注意,在任何一种情况下,您都在调用
res.status(400)
,即使是在成功时(在调用
之前,然后调用
),这可能不是您想要的。所以你可能需要一个中间立场:

findQnameForId
.then(mongoDelete)
.then(mysqlDelete)
.then(res.send.bind(res), function(err) {
    res.status(400).send(err));
});

这样,如果出现错误,您只需调用
res.success(400)

谢谢,尽管我最终需要使用
。然后(res.status(200).send.bind(res),…
)-不确定为什么在本例中不使用默认的200。
的奇妙之处是!@SimonH:很高兴提供帮助。但是如果您有
。那么(res.status(200).send.bind(res),res.status(400).send.bind(res))
注意您正在调用
res.status(200)
,然后是
.bind(res)
,然后是
res.status(400)
,然后是
.bind(res)
,然后
。然后
。这意味着最后一次调用
状态
的值将为400。但如果您正在执行我在答案末尾所做的操作,那么
状态(400)
只会在错误情况下发生,并且您状态良好。:-)我不确定这是运气还是判断,但我使用了最后一个片段,添加了
status(200)
。感谢您的帮助使用箭头函数:
。然后(()=>res.send(),err=>res.status(400).send(err))
这就是它们的用途。