将简单函数直接传递给 es6 promise.then

Pass simple function directly to es6 promise.then

我在快速路由函数中有以下 ES6 承诺链(即 res 是快速响应对象)。 findQnameForId 是一个 Promise,而 mongoDelete 和 mysqlDelete 都是 return Promise。当我使用注释掉的代码而不是当前的最后一行时,链条工作,但我的问题是为什么我不能将 res.send 直接传递给 then(如图所示)并让它成为 return然后将结果返回给客户端?

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);
// });

我认为这与回调期间没有正确的 this 值有关。它可能适用于 bind:

var fourhundred = res.status(400);
findQnameForId
.then(mongoDelete)
.then(mysqlDelete)
.then(res.send.bind(res), fourhundred.send.bind(fourhundred));

...但请继续阅读。

如果你确定res.status(400)returnsres,那就简单一点:

findQnameForId
.then(mongoDelete)
.then(mysqlDelete)
.then(res.send.bind(res), res.status(400).send.bind(res));

...但请继续阅读。

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

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

这样,您只在发生错误时才调用 res.success(400)