如何在执行多个异步调用时阻止调用函数,然后继续处理收集的数据?

时间:2017-03-30 16:59:04

标签: javascript asynchronous synchronization async-await wait

我想在 JavaScript 中处理XML文件,异步读取每个工作表(因为它显然会更快),并返回最终结果。我有解析器功能,当我想等待每个异步调用完成,然后返回结果时,我卡在了该部分上。在这种情况下,回调对我来说不是最佳做法,因为在另一个模块的开始时会调用此函数,我不想放置其余的代码(让我们这样做)在回调中说例如500行)。

我尝试过很多种方法,最后一种方法如下所示。但它似乎导致无限循环。所有其他尝试都返回未定义的值,因为调用函数在异步调用完成之前结束,并且累加器没有任何值。

1.为了收集每个异步电话的结果,我使用了承诺

function getAllSheets(callback) {
    accumulator = {};

    promise.all([
        processOneSheetAsync(workbook, sheetname1, ..., callback(data) {
            accumulator.one = data;
        }),
        processOneSheetAsync(workbook, sheetname2, ..., callback(data) {
            acc.two = data;
        }),
        /* some more function calls */
    ]).then(function(result) {
        callback(acc);
    });
}

注意:processOneSheetAsync()是一个返回new Promise并按预期调用parser()的函数。


然后我试着在这样的函数中等待它的回调:

function getResult() {
    var result;
    var callback = false;

    getAllSheets(function(data) {
        result = data;
        callback = true;
    });

    while(!callback){};
    return result;
}

我认为这会阻止getResult()函数,直到变量callback设置为true。但是,似乎while循环从未检测到callback的更改。

有没有什么好方法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

你应该真的使用回调。我可能会做类似的事情:

var myResults=[];
var waiting=0;

data.forEach(function(datum){
    waiting++;
    asyncCall(datum, callback);
}

function callback(result){
    myResults.push(result);
    waiting--;
    if (waiting == 0){
         doStuffOn(myResults);
    }
}

但是,如果您仍然反对世界上最好的一切,那么您应该查看this,找到here