Node.js在Q中的不同点中止链

时间:2014-06-27 10:38:03

标签: javascript node.js promise q

我在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种不同的函数中分块代码。

1 个答案:

答案 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结构中。您似乎不需要进行此类测试,因为失败时的操作在所有情况下都是相同的。