如何在javascript中创建嵌套承诺?

如何在javascript中创建嵌套承诺?,javascript,nested,asynccallback,Javascript,Nested,Asynccallback,我使用的是纯javascript。对于数组的每个元素,我有3个任务要做。我已经为每个元素创建了承诺,其中每个元素都承诺为每个元素执行任务。现在在每一个里面,我想做出三个承诺,每个任务一个 processElement=processArrayElementFunction(matrix); unique.forEach(function (number,index) { promises.push(new promiseToProcessElement(index,number,proces

我使用的是纯javascript。对于数组的每个元素,我有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、repetition只是完成任务的一些函数。它们并不重要

现在,var result=callbackProcessElementid,num,matrix;在函数PromiseToprocess中,元素未定义。
我认为问题在于,因为程序需要这个结果,而没有完成每个元素的3个任务。这是真的吗?我该如何修复它呢?

您的问题在于这两个函数,我添加了注释来标记它们:

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);
}
主要的问题是,您在提供的代码中使用承诺时没有任何好的理由,因此我假设sumRC是一个异步函数,它的末尾有一个回调,使其具有某种意义。

确保processArrayElementFunction返回承诺。全部


你介意把你的代码去掉吗?它很难阅读,而且缺少一些括号。我建议你更仔细地阅读有关承诺的内容。。。你所有的承诺都会同时召唤resolve。。。你可以把它们全部移除,它也会做同样的事情。您需要使用then并返回承诺,这样您就可以链接。@TheRickest我已经删除了代码。你能帮我吗?@Salketer你有什么建议吗?事实上,事情并没有那么简单。。。重新阅读代码似乎误用了所有函数返回值。我应该如何组织?我以前从未使用过承诺首先将代码减少到最低限度。。。有3个函数只返回一些内容而不执行任何操作。你完全可以摆脱他们,你能帮我吗?除了processArrayElementFunction,我不明白,我应该做什么?你的解决方案显示了这个承诺{[[PromiseStatus]]:未决,[[PromiseStation]]:未定义的}承诺{[PromiseStatus]]:已解决的[[PromiseStatus]]:对象它说:承诺{[PromiseStatus]]:未决,[[PromiseStation]]:未定义的}[[PromiseValue]]:对象,但最终会产生结果。
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(..);});
    };
}