将简单函数直接传递给 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)
。
我在快速路由函数中有以下 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)
。