【发布时间】:2020-10-19 03:58:32
【问题描述】:
过去几天我一直在尝试解决这个问题,并阅读了 StackOverflow 和其他网站上的各种解决方案。
我正在构建一个站点,该站点从外部来源获取 XML 数据,然后根据结果获取更多 XML 以构建网络图。 问题是我必须等到这个 AJAX 调用循环(可能会循环到更多 AJAX 调用)完成后再进行绘制。
我不知道这是否有特别高的认知负担,但它真的让我难过。
我的代码:
function cont(outerNodes) {
for (var i = 0; i < outerNodes.length; i++) {
var node = outerNodes.pop();
getXML(node["label"], node["id"]);
}
// I want the code to wait until loop is done, and then draw.
draw(nodes, edges);
}
function getXML(term, fromId) {
var url = someURL;
$.ajax({
url: url,
dataType: "xml",
success: function(result) {
var outerNodes = process(result, fromId, term);
cont(outerNodes);
}
});
}
注意:我知道我在这里可能完全误解了 JavaScript 同步性,我很可能是。我过去曾成功使用过回调和承诺,但我似乎无法理解这一点。
如果我还没有完全清楚,请告诉我。
我确实尝试过实现一个在 process() 函数中递增的计数器,如下所示:
if (processCount < 15) {
for (var i = 0; i < outerNodes.length; i++) {
var node = outerNodes.pop();
getXML(node["label"], node["id"]);
}
} else {
draw(nodes, edges);
}
但是,这最终导致了几次 draw() 调用,这让我的表现非常糟糕。
【问题讨论】:
-
这个场景最好使用promise。否则你可以添加一个计数器,检查计数器数量是否达到,然后执行draw方法。
-
我使用了计数器的方法。虽然它可以工作,但最终会出现多个绘图调用,这让我的表现变得很糟糕。我不确定如何在这里实现承诺。
-
代码是怎么写的?你能把它粘贴到问题中吗?
-
添加到底部。
-
你的代码其实有一些错误,你是什么时候增加processCount的?
标签: javascript jquery ajax