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