我在Q中有一个很长的检查链,我会在错误上升时中断它:
我已经看过How to abort a failing Q promise in Node.JS以及其他关于SO的答案,但对我来说似乎是不可能的,因此不能存在。
实施例 `
Q().then(function(){
return Q.ninvoke(myObject, 'save');
}).fail(functon(err){ // if error
res.status(400).send(err.message);// like duplicate key
}).then(function(){
add object another object to db referenced to myObject
}).fail(functon(err){ // if error
res.status(400).send(err.message);// like connection error
}).then(function(){
do somethinng else
}).done()
`
显然,如果它不能保存第一个对象,我就不会继续执行其他步骤,但是我会退出而不会抛出错误并阻止服务器的执行,而不会将消息发送给客户端。
我尝试添加两个功能来完成(OK,REJECTED),但只调用OK()。 如果可能的话,我想避免在3种不同的函数中分块代码。
答案 0 :(得分:0)
据我所知,你不需要做任何特别棘手的事情,只需了解成功和失败如何通过.then
链传播,然后利用这些知识来获得你想要的行为。
此行为是Promises/A+标准的核心。
如果您要使用单个终端.fail
编写您的链,那么(如果我理解正确的话)您将获得您寻求的行为。
Q().then(function () {
return Q.ninvoke(myObject, 'save');
}).then(function () {
add object another object to db referenced to myObject
}).then(function () {
do somethinng else
}).fail(functon (err) {
res.status(400).send(err.message);
});
在这里,.then
链中的任何一点失败都会导致预设的承诺直接通过.then
的其余部分,并被终端.fail
捕获。
这比问题中的代码具有优势,该代码具有多个交织的.fail
。可以使该模式起作用,但是一旦处理完故障,您需要引入一种机制来抑制多个“失败”行为。在不寻常的情况下,这可能是合适的,但总的来说它会被视为混乱。
失败处理程序中您可能需要的另一件事是在不同类型的故障之间进行解除并相应地采取行动。这是非常简单的,因为可以测试形式变量err
,例如在switch-case结构中。您似乎不需要进行此类测试,因为失败时的操作在所有情况下都是相同的。