在Promise中创建递归而不是多次调用

时间:2018-11-15 15:50:30

标签: javascript recursion promise

我有此代码:

var arrMultiplication = function(arr1, arr2) {
  return new Promise(function(resolve, reject) {

    if ( arr1.length ==arr2.length ) {
        temp =new Array();
        for(var i=0;i<arr1.length;i++){
        temp.push(arr1[i]*arr2[i]);
      }
      resolve(temp);
    } else {
      reject(Error("Promise Rejected"));
    }
  });
}
//[1,2,5], [1,2,0],[2,2,2].[1,2,3]
var A=[1,2,5];
var B=[1,2,0];
var C=[2,2,2];
var D=[1,2,3];
arrMultiplication(A,B).then(function(result){
    arrMultiplication(C,result).then(function(result){
    arrMultiplication(D,result).then(function(result){
        alert(result);
    });
  });
});

JSfiddle

我如何简化操作而不是多次调用promise 如果我将A B C D E F作为数组,它将以这种方式复杂化。 如何使它变得更容易。

1 个答案:

答案 0 :(得分:1)

尽管我同意@szab的评论,即您在此处不需要Promises,但总的来说,您可以使用reduce来链接n长度的诺言。

示例:

var arrMultiplication = function(arr1, arr2) {
      return new Promise(function(resolve, reject) {
        
        if ( arr1.length ==arr2.length ) {
        	temp =new Array();
        	for(var i=0;i<arr1.length;i++){
          	temp.push(arr1[i]*arr2[i]);
          }
          resolve(temp);
        } else {
          reject(Error("Promise Rejected"));
        }
      });
    }
    //[1,2,5], [1,2,0],[2,2,2].[1,2,3]
    var A=[1,2,5];
    var B=[1,2,0];
    var C=[2,2,2];
    var D=[1,2,3];
    var allArrays = [A, B, C, D];
    
    const multiplicationsPromise = allArrays.reduce((resultPromise, currentArray) => {
    	return resultPromise.then(result => arrMultiplication(result, currentArray))	
    }, Promise.resolve([1,1,1]))
    
    multiplicationsPromise.then(result => alert(result));

工作小提琴here