在节点中,使用 Q,使 2 个函数并行工作,但只等待第一个函数实现它的承诺
in node, using Q, make 2 functions work in parallel but wait only for the first one to fulfill its promise
在我的环境中,我使用 node +q(我不是这方面的专家),所以主要论点是:promises。
我有一个函数需要并行进行 2 个操作,一个很长,一个很短。
var parallelWrapper = function(input) {
var deferred = Q.defer();
var fastPromise = fastComputation()
.then(function(data) {
deferred.resolve(data)
},
function(err) {
deferred.reject(err)
});
// of course this one below is not going to work properly
var slowPromise = slowComputation()
.then(function(data) {
makeSomething();
})
.then(function(data) {
makeSomethingElse();
})
.fail(function(err) {
console.log(err);
});
Q.all([fastPromise, slowPromise]);
retrun deferred.promise;
}
这个函数将在承诺链中调用,因为需要第一个操作的结果,而第二个操作的结果不需要。
var myLongChainOfFunctions = function() {
var deferred = Q.defer();
firstFunction(someParams)
.then(secondFunction)
.then(thirdFunction)
/*...*/
.then(parallelWrapper)
.then(someFunction(data){
/* Do Something with the data returned only by fastPromise*/
}
/*...*/
.then(lastFunction)
.fail(doSomething)
return deferred.promise;
}
我想做的是让它们并行进行,但在 fastPromise 完成后立即解决,以便链式承诺可以向前推进,但显然在未来的某个时候我也想要 slowPromise完成。
所以我只希望 slowPromise 过好自己的生活,做自己该做的事情,不要太在意成败。
我的印象是 Q 不可能,但也许有一个我没有发现的解决方案。
我会这样做的:
var parallelWrapper = function(input) {
var fastPromise = fastComputation();
var slowPromise = slowComputation()
.then(function(data) {
return makeSomething();
})
.then(function(data) {
return makeSomethingElse();
}).catch(console.error);
return Q([fastPromise, slowPromise]).all();
}
第二个例子是这样的:
var myLongChainOfFunctions = function() {
return firstFunction(someParams)
.then(secondFunction)
.then(thirdFunction)
/*...*/
.then(parallelWrapper)
/*...*/
.then(lastFunction)
.catch(doSomethingWithError)
}
好的,你可以这样做:
var parallelWrapper = function(input) {
slowComputation()
.then(function(data) {
return makeSomething();
})
.then(function(data) {
return makeSomethingElse();
}).catch(console.error);
return fastComputation();
}
在我的环境中,我使用 node +q(我不是这方面的专家),所以主要论点是:promises。
我有一个函数需要并行进行 2 个操作,一个很长,一个很短。
var parallelWrapper = function(input) {
var deferred = Q.defer();
var fastPromise = fastComputation()
.then(function(data) {
deferred.resolve(data)
},
function(err) {
deferred.reject(err)
});
// of course this one below is not going to work properly
var slowPromise = slowComputation()
.then(function(data) {
makeSomething();
})
.then(function(data) {
makeSomethingElse();
})
.fail(function(err) {
console.log(err);
});
Q.all([fastPromise, slowPromise]);
retrun deferred.promise;
}
这个函数将在承诺链中调用,因为需要第一个操作的结果,而第二个操作的结果不需要。
var myLongChainOfFunctions = function() {
var deferred = Q.defer();
firstFunction(someParams)
.then(secondFunction)
.then(thirdFunction)
/*...*/
.then(parallelWrapper)
.then(someFunction(data){
/* Do Something with the data returned only by fastPromise*/
}
/*...*/
.then(lastFunction)
.fail(doSomething)
return deferred.promise;
}
我想做的是让它们并行进行,但在 fastPromise 完成后立即解决,以便链式承诺可以向前推进,但显然在未来的某个时候我也想要 slowPromise完成。 所以我只希望 slowPromise 过好自己的生活,做自己该做的事情,不要太在意成败。
我的印象是 Q 不可能,但也许有一个我没有发现的解决方案。
我会这样做的:
var parallelWrapper = function(input) {
var fastPromise = fastComputation();
var slowPromise = slowComputation()
.then(function(data) {
return makeSomething();
})
.then(function(data) {
return makeSomethingElse();
}).catch(console.error);
return Q([fastPromise, slowPromise]).all();
}
第二个例子是这样的:
var myLongChainOfFunctions = function() {
return firstFunction(someParams)
.then(secondFunction)
.then(thirdFunction)
/*...*/
.then(parallelWrapper)
/*...*/
.then(lastFunction)
.catch(doSomethingWithError)
}
好的,你可以这样做:
var parallelWrapper = function(input) {
slowComputation()
.then(function(data) {
return makeSomething();
})
.then(function(data) {
return makeSomethingElse();
}).catch(console.error);
return fastComputation();
}