在Promise.all循环后调用函数

时间:2018-10-30 04:56:31

标签: javascript promise

所以我写了关于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),在每个函数中,我还编写了Promise脚本,这些脚本从API(当我从设备调用API时返回值)返回值,返回JSON数据)。 JSON数据工作正常,我可以使用函数访问它并返回一些预期值。

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

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

2 个答案:

答案 0 :(得分:0)

您可以将每个indexOf() String monthString = dateString.substring(0,dateString.indexOf("/")); String dayString = dateString.substring(dateString.indexOf("/"),DateString.indexOf("/")+1) 与其关联的.map,这样您就有debug的数组。然后,之后调用该数组上的Promise.all,您可以一次添加所有行。

请注意,由于Promise.allPromise.all看起来已经返回searchStart,因此不需要explicit Promise constructor antipattern-仅使用现有的Promise。另外,通过在searchEnd内部返回值,可以避免使用外部变量,例如Promises.thensxxsyy

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,也可以在解析后将其传递并与其他关联值一起使用

答案 1 :(得分:0)

我不清楚您想要什么,但是我有两个答案可能会对您有所帮助 解决方案1:它将一次解决每个承诺,然后继续下一个

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();
 }