Promises: q.all() 混合同步和异步功能
Promises: q.all() with mixed sync and async functions
我仍在学习 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;
}
但看起来很蠢。
我想这不是个好方法,对吧?
非常感谢
将非承诺值放入 Q.all
的输入数组中没有问题。他们将被视为已经兑现的承诺。
但是,您需要将实际值(或承诺)放入数组中,而不是 return 它们的函数。就去
Q.all([
jenkins.checkConfig(),
gitlab.checkConfig(),
sonar.checkConfig()
]).then(doSomethingReallyCoolHere);
如果您确实希望检查成功(并阻止 运行 的 then
回调),您确实需要 return 一个被拒绝的承诺。不过,您不应该为此使用延迟:
function checkConfig() {
if (awesomeSyncTestHere())
return Q(true);
else
return Q.reject(new Error("awesome fail"));
}
或者,如果你有一个真正 throw
的测试,只需使用 Q.try
function checkConfig() {
return Q.try(awesomeSyncTestHere);
}
我仍在学习 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;
}
但看起来很蠢。
我想这不是个好方法,对吧?
非常感谢
将非承诺值放入 Q.all
的输入数组中没有问题。他们将被视为已经兑现的承诺。
但是,您需要将实际值(或承诺)放入数组中,而不是 return 它们的函数。就去
Q.all([
jenkins.checkConfig(),
gitlab.checkConfig(),
sonar.checkConfig()
]).then(doSomethingReallyCoolHere);
如果您确实希望检查成功(并阻止 运行 的 then
回调),您确实需要 return 一个被拒绝的承诺。不过,您不应该为此使用延迟:
function checkConfig() {
if (awesomeSyncTestHere())
return Q(true);
else
return Q.reject(new Error("awesome fail"));
}
或者,如果你有一个真正 throw
的测试,只需使用 Q.try
function checkConfig() {
return Q.try(awesomeSyncTestHere);
}