防止 promise 链进入下一步

Prevent promise chain to go next step

首先我想问一下这是否是一个很好的处理 promises 的解决方案。

app.get('/sample', function(req, res) {

var promiseFlow = {

    step1: function() {
        return modelPromise1();
    },

    step2: function(result) {
        if(result) {
            // I would like to stop the promise chain here
            res.send(result);
        } else {
            return modelPromise2();
        }
    },

    step3: function(result) {
        if(result) {
            res.send(result);
        } else {
            // This will be sent always
            res.send(false);
        }
    }

}

promiseFlow.step1()
    .then(promiseFlow.step2)
    .then(promiseFlow.step3)
    .catch(function(error) {
        console.log(error);
    });

});

用户模型示例:

_self.get_user_info = function(_guid) {
var deferred = modules.Q.defer();

modules.system.db.connect(deferred, function(connection) {
    var query = modules.qb.select().from('users')
                    .field('_guid')
                    .field('username')
                    .where('_guid = ?', _guid);

    connection.query(query.toString(), function(error, result) {
        connection.release();
        if(error) {
            deferred.reject(error);
            return; 
        }
        if(result.length) {
            deferred.resolve(result);
        } else {
            deferred.reject(null);
        }

    });
});
return deferred.promise;

}

我的主要问题是我不知道如何打破这个链条而不是 执行下一步。 res.send(false) 无论如何都会在步骤 3 中发生。 这个东西可以用吗,或者我应该为此选择其他模式。

谢谢!

这确实没有什么不同,但会使代码复杂化。

试试这个:

modelPromise1()
  .then(function(result) {
    if (!result) return modelPromise2();
  }).then(function(result) {
    if (!result) res.send(false);
    else res.send(result);
  }).catch(/*...*/);

我认为问题在于你是从另一个角度来处理它的。 承诺应在成功时履行,并在错误时拒绝。

then方法有两个参数:第一个是处理成功,第二个是处理拒绝。在拒绝时,控制流跳转到下一个拒绝处理程序 - 在实现时,它只是转到下一个实现处理程序。通常我更喜欢这个而不是catch,因为它更清楚地表明了谁的错误被处理了。

您似乎在尝试将成功(当您发送响应时)处理为错误,反之亦然。 你应该在错误而不是成功时打破链条。

此外,您的承诺应该在错误时被拒绝(例如,在失败时抛出异常,或拒绝承诺)而不是不返回结果。

你需要这样的东西:

promise1()
  .then(function(result) {
    res.send(result);
  }, function(error) {
    return promise2()
      .then(function(result) {
        res.send(result);
      }, function(result) {
        res.send(false);
      });
  });