【问题标题】:Call function after Promise.all inside a loop在循环内的 Promise.all 之后调用函数
【发布时间】:2018-10-30 16:08:18
【问题描述】:

所以我写了关于 promise 的 javascript。我在这样的 for 循环中做出了两个承诺:

for(let i=0; i<globalName.length; i++ ){                
    let debug = globalName[i];

    var promise1 = new Promise(function(resolve,reject){                    
        var j = searchStart(startT,debug);

        resolve(j)

    }).then(function(result){
        sxx = result;                   
    }); 


    var promise2 = new Promise(function(resolve,reject){
        var k = searchEnd(endT,debug);

        resolve(k);

    }).then (function(result){
        syy = result;                   
    });

    Promise.all([promise1, promise2]).then(function(values) {

        let localed = [];
        entry[i] = sxx;
        exit[i] = syy;

        localed.push({
            "name" : debug,
            "first" : entry[i],
            "last" : exit[i]
        });
        xtable.rows.add(localed).draw();                    
    });             
}

在每个promise中,我调用函数searchStart(startT,debug)和searchEnd(endT,debug),在每个函数中,我还编写了从API返回值的promise脚本(准备从设备调用API,当我调用它时,返回JSON数据)。 JSON 数据工作正常,我可以使用我的函数访问它并返回一些预期值。

使用Promise.all 当我的函数返回值时,我将数据写入DataTables 提供的表中。但当然,因为函数在上述两个 promise 解决时运行,所以它只能将每一行数据写入我的表。

现在,我想问的是,我是否可以设法先写入所有数据,然后在数据完成后调用其他函数写入表?

【问题讨论】:

  • 是的,将每个 promise1 和 promise2 保存在一个数组中......但是你为什么要使用 promise,因为似乎没有任何异步发生
  • @bravo 实际上是调用 API 的函数,它返回完成任务所需的不同时间,因为它在 JSON 对象中包含大量数据,所以我认为我应该使用承诺来等待每个调用进度
  • 如果 searchStart 和 searchEnd 是异步的,你就做错了——你不是在等待它们完成,你只是在解决它们返回的任何问题......哦...他们返回一个承诺?那么就不需要 Promise 构造函数了

标签: javascript promise


【解决方案1】:

您可以将每个debug.map 与其关联的Promise.all 关联起来,这样您就有了一个Promise.alls 数组。然后,在对该数组调用 Promise.all 之后,您可以一次添加所有行。

请注意,由于 searchStart 和 searchEnd 看起来已经返回 Promises,因此不需要 explicit Promise constructor antipattern - 只需单独使用现有的 Promise。此外,通过在 .then 中返回值,您可以避免使用外部变量,例如 sxx、syy、entry[i] 和 exit[i]:

const promiseAlls = globalName.map((debug, i) => {
  return Promise.all([
    debug, // see below for note
    searchStart(startT, debug),
    searchEnd(endT, debug)
  ]);
});
Promise.all(promiseAlls).then((allArrs) => {
  allArrs.forEach(([
    name, // this is the same as the "debug" variable above
    first, // this is the same as `entry[i]`, or `sxx`, in your original code
    last // this is the same as `exit[i]`, or `syy`, in your original code
  ]) => {
    const localed = [{ name, first, last }];
    xtable.rows.add(localed).draw(); 
  });
});

debug 在初始 Promise.all 中使用,即使它不是 Promise,以便它可以传递并与其他关联值一起使用,一旦它们被解析。

【讨论】:

    【解决方案2】:

    我不清楚你想要什么,但我有两个答案可以帮助你 解决方案1:它会一次解决每个promise,然后继续下一个

    function searchStartAndEnd(flag = false, date, debug){
      return new Promise((resolve, reject)=>{
            var j;
            if(flag){
                j = searchStart(date, debug);
            }else{
                j = searchStart(date, debug);
            }
           resolve(j)
      })
    }
    
    for(let i=0; i<globalName.length; i++ ){                
        let debug = globalName[i];
        sxx = await searchStartAndEnd(true, startT, debug);
        syy = await searchStartAndEnd(false, endT, debug) ;  
        localed.push({
            "name" : debug,
            "first" : sxx,
            "last" : syy]
        });
        xtable.rows.add(localed).draw();
    }
    
    solution 2: It will solve all promise parallel then do move to the next task, then move next iteration
    function searchStartAndEnd(flag = false, date, debug){
      return new Promise((resolve, reject)=>{
            var j;
            if(flag){
                j = searchStart(date, debug);
            }else{
                j = searchStart(date, debug);
            }
           resolve(j)
      })
    }
     for(let i=0; i<globalName.length; i++ ){                
        let debug = globalName[i];
        sxx = await ;
        [sxx, syy] = await Promise.all([searchStartAndEnd(true, startT, debug), 
        searchStartAndEnd(false, endT, debug)])  
        localed.push({
            "name" : debug,
            "first" : sxx,
            "last" : syy]
        });
        xtable.rows.add(localed).draw();
     }
    

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多