我正在使用普通的javascript。我有3个任务要做的数组的每个元素。我为每个元素创建了promises,每个元素都承诺为每个元素执行任务。现在在每一个内部,我想做3个承诺,每个任务一个。
processElement=processArrayElementFunction(matrix);
unique.forEach(function (number,index)
{
promises.push(new promiseToProcessElement(index,number,processElement,matrix));
});
Promise.all(promises).then((results) => {console.log(results);});
function promiseToProcessElement(id,num,callbackProcessElement,matrix)
{
return new Promise((resolve, reject) => {
resolve(callbackProcessElement(id, num,matrix););
});
}
function processArrayElementFunction(matrix)
{
return function(index, number)
{
var promises=[];
promises.push(new promiseTask(index,sumRC,matrix));
promises.push(new promiseTask(index,sumAround,matrix));
promises.push(new promiseTask(number,repetitions,matrix));
Promise.all(promises).then((results) => {
return results;
});
};
}
function promiseToProcessElement(id,num,callbackProcessElement,matrix)
{
return new Promise((resolve, reject) => {
resolve(callbackProcessElement(id, num,matrix););
});
}
function promiseTask(num,callbackTask,matrix)
{
return new Promise((resolve,reject)=>
{
resolve(callbackTask(num,matrix));
});
}
sumRC,sumAround,重复只是执行任务的一些函数。它们并不重要。
现在var result=callbackProcessElement(id, num,matrix);
中的function promiseToProcessElement
为undefined
。
我认为问题是,因为,程序需要这个结果,而不完成每个元素的3个任务。这是真的?我该如何修复它?
答案 0 :(得分:1)
你的问题在于这两个功能,我已添加注释来标记它们:
function promiseToProcessElement(id,num,callbackProcessElement,matrix)
{
return new Promise((resolve, reject) => {
var result=callbackProcessElement(id, num,matrix);
resolve(result);//You resolve the promise without waiting.
});
}
function processArrayElementFunction(matrix)
{
return function(index, number)
{
var promises=[];
promises.push(new promiseTask(index,sumRC,matrix));
promises.push(new promiseTask(index,sumAround,matrix));
promises.push(new promiseTask(number,repetitions,matrix));
// You do not return anything.
Promise.all(promises).then((results) => {
return {Elementi: index+1,ShumaRreshtKolone:results[0],ShumaNrRrethues:results[1],sumAround:results[2]};
}
).catch(function (error){console.log(..);});
};
}
你创造了太多的承诺......你可以保留它们,或者简化它,这取决于你,但这就是我如何修复它。
function promiseToProcessElement(id,num,callbackProcessElement,matrix)
{
//Do not create another promise, just return the one that is created for the tasks.
return callbackProcessElement(id, num,matrix);
}
function processArrayElementFunction(matrix)
{
return function(index, number)
{
var promises=[];
promises.push(new promiseTask(index,sumRC,matrix));
promises.push(new promiseTask(index,sumAround,matrix));
promises.push(new promiseTask(number,repetitions,matrix));
// Return the promise so we can chain.
return Promise.all(promises).then((results) => {
return {Elementi: index+1,ShumaRreshtKolone:results[0],ShumaNrRrethues:results[1],sumAround:results[2]};
}
).catch(function (error){console.log(..);});
};
}
我认为这会有效,但很难说你的代码没有被剥离到最低限度,而且似乎使你的任务过于复杂。
我觉得这应该是这样的。
unique.forEach(function (number,index)
{
promises.push(doTask(number,matrix));
Promise.all(promises).then((results) => {console.log(results);}
).catch(function (error){...);});
function doTask(number,matrix){
let proms = [];
proms.push(new Promise(function(done){
sumRC(number,matrix,done);
}));
proms.push(new Promise(function(done){
sumAround(number,matrix,done);
}));
proms.push(new Promise(function(done){
repetitions(number,matrix,done);
}));
return Promise.all(proms).then(function(results){
return {Elementi: index+1,ShumaRreshtKolone:results[0],ShumaNrRrethues:results[1],sumAround:results[2]};
});
}
//Example of how sumRC should look
function sumRC(number,matrix,done){
//DO SUM or whatever
var result = number+1;
done(result);
}
主要的问题是你在你提供的代码中没有任何正当理由使用promises,所以我假设sumRC是一个异步函数,最后有一个回调函数,意思是什么。
答案 1 :(得分:0)
确保processArrayElementFunction
返回Promise.all
function processArrayElementFunction(matrix)
{
return function(index, number)
{
var promises=[];
promises.push(new promiseTask(index,sumRC,matrix));
promises.push(new promiseTask(index,sumAround,matrix));
promises.push(new promiseTask(number,repetitions,matrix));
RETURN Promise.all(promises).then((results) => {
return {Elementi: index+1,ShumaRreshtKolone:results[0],ShumaNrRrethues:results[1],sumAround:results[2]};
}
).catch(function (error)
{
console.log(..);});
};
}