gpt4 book ai didi

javascript - 如何阻塞调用函数并执行多个异步调用,然后继续处理收集到的数据?

转载 作者:行者123 更新时间:2023-11-28 04:48:45 25 4
gpt4 key购买 nike

我想在 JavaScript 中处理 XML 文件,异步读取每个工作表(因为显然它会更快),并返回最终结果。我有解析器函数,当我想等待每个异步调用完成然后返回结果时,我陷入了困境。在这种情况下,回调对我来说不是最佳实践,因为这个函数将在另一个模块的开头被调用,我不想将其余的代码(比如说 500 行)放在一个打回来。

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

1. 为了收集每个异步调用的结果,我使用了 promise

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() 是返回一个新 Promise 并按预期调用 parser() 的函数。


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

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

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

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

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

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

最佳答案

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

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

关于javascript - 如何阻塞调用函数并执行多个异步调用,然后继续处理收集到的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43124051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com