首先,我想问一下这是否是一个很好的解决方案来处理承诺。
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步中发生。 这件事可以起作用吗,或者我应该为此选择其他模式。
谢谢!
答案 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);
});
});