一个对多个承诺的承诺-并发问题 [英] One Promise for Multiple Promises - Concurrency Issue
问题描述
在我的"gulpfile.js"的方法"myMethod"中,我想创建多个Promises.数量取决于数组大小(方法参数).当我调用该方法时,我想确保在继续执行之前所有的诺言都得到了实现.我宁愿不兑现所有诺言.
In the method "myMethod" of my "gulpfile.js" I want to create multiple Promises. The quantity depends on the array size (method parameter). When I call the method I want to make sure that all promises are fulfilled before I continue. I would prefer to return not before all promises are fulfilled.
请查看代码的最后五行.
依赖项
var promiseAll = require('gulp-all');
var del = require('del');
var deleteEmpty = require('delete-empty');
辅助方法
var oneForAllPromises = function(promises){
var promAll = promiseAll(promises);
promAll.then(function(param) {
console.log('foo');
}, function(err) {
console.error('foo');
});
return promAll;
}
问题代码
var myMethod = function(array1, array2){
var promise = del(array1, {force: true});
promise.then(paths => {console.log('foo');});
var promises = [];
promise.then(()=>{
for(var i=0; i<array2.length; i++){
promises[i] = new Promise(function(resolve, reject) {
deleteEmpty(array2[i], {force: true},
function(err, deleted){
if(err){
console.log('foo');
reject
}else{
console.log('foo');
resolve
}
}
);
});
}
});
// PROBLEM: Returns empty promises array
console.log("promiesesLENGTH: "+promises.length); // promiesesLENGTH: 0
// Create one promise for all the promises
return oneForAllPromises(promises);
}
推荐答案
在console.log时,第一个承诺promise = del(array1, {force: true});
尚未完成,因此then
中的代码均未执行.这就是为什么你的诺言是空的.
At the time of the console.log, the first promise promise = del(array1, {force: true});
is not yet finished, so none of the code in the then
is yet executed. That's why your promises are empty.
您可以简单地返回另一个承诺:
You can simply return in a then another promise:
var myMethod = function(array1, array2){
var promise = del(array1, {force: true});
return promise.then(() => {
return Promise.all(array2.map(array2value => {
return new Promise(function(resolve, reject) {
deleteEmpty(array2value, {force: true}, (err, deleted) => {
if (err) {
reject(err);
} else{
resolve()
}
});
});
}
});
}
这篇关于一个对多个承诺的承诺-并发问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!