我还在学习Promises,我正面临着一个问题。也许你可以帮助我。
我有一个任务,在运行真实的东西之前做一些检查。其中一些检查是同步的,另一些检查是异步的。
所以我想要这样的东西:
q.all([
jenkins.checkConfig,
gitlab.checkConfig,
sonar.checkConfig
])
.then(
function() {
doSomethingReallyCoolHere();
}
);
但是如果sonar.checkConfig不是承诺呢?我怎样才能给它一个承诺行为?
目前我正在这样做
var checkConfig = function() {
var qChecked = q.defer();
var isOK = awesomeSyncTestHere();
if (isOK) {
qChecked.resolve();
}
else {
qChecked.reject();
}
return qChecked.promise;
}
但它看起来很愚蠢。
我想这不是一个好方法,对吗?
非常感谢
答案 0 :(得分:1)
将输入数组中的非承诺值放到Q.all
没有问题。他们将被视为与他们一起实现的承诺。
但是,您需要在数组中放置实际值(或promises),而不是返回它们的函数。只是去
Q.all([
jenkins.checkConfig(),
gitlab.checkConfig(),
sonar.checkConfig()
]).then(doSomethingReallyCoolHere);
如果你确实希望你的支票抛出(并阻止then
回调运行),你将需要确实返回被拒绝的承诺。但是,您不应该使用延迟:
function checkConfig() {
if (awesomeSyncTestHere())
return Q(true);
else
return Q.reject(new Error("awesome fail"));
}
或者,如果您的测试真的是throw
,请使用Q.try
function checkConfig() {
return Q.try(awesomeSyncTestHere);
}