防止承诺链进入下一步

时间:2015-10-08 09:43:56

标签: javascript node.js promise q

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

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步中发生。 这件事可以起作用吗,或者我应该为此选择其他模式。

谢谢!

2 个答案:

答案 0 :(得分:0)

字面上没有什么不同,但使代码复杂化。

试试这个:

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

答案 1 :(得分:0)

我认为问题是你从另一个方面接近它。 承诺应该在成功时实现,并在错误时被拒绝。

then方法有两个参数:第一个是处理成功,第二个是处理拒绝。在拒绝时,控制流跳转到下一个拒绝处理程序 - 在履行时,它只是转到下一个履行处理程序。通常我更喜欢catch,因为它可以更清楚地处理错误。

看起来你正试图处理成功(当你发送响应时)作为错误,反之亦然。 你应该在出错时打破链条,而不是成功。

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

你需要这样的东西:

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