javascript - 另一个异步调用的回调中的异步调用
问题描述
我熟悉异步 javascript 调用的细微差别。所有处理从异步调用返回的数据的工作都必须在回调中完成。收到。
在下面的代码中,我的.ajax()
调用从 C# 通用处理程序中检索船员的序列化列表,并且回调包含一个.get()
(也是异步的),它检索模板并将每个船员的数据与 html 模板合并,并注入它进入页面。
所有这些都可以正常工作,但是,最后,循环中的每次迭代都会完成,并且页面上插入的每个面板仅包含来自列表中最后一个工作人员的数据。
因此,我最终将页面上的所有面板都用于同一个人。列表中的最后一个人。
.get()
是从 的回调中发出的.ajax()
。该工作正在.done()
内部的回调中执行.get()
。
这应该是安全的,我想。该工作正在调用的回调中完成,.ajax()
而处理该数据的工作正在..done()
.get()
发生的情况是循环触发所有“1 到 n”次。然后.done()
回调触发“1到n”次。
我怀疑即使.get()
在 for 循环中调用了,for 循环也不是异步的,并且在某个地方存在问题。
$.ajax({
type: "POST",
url: "js/handlers/LoadCrew.ashx",
dataType: "text",
cache: false,
success: function (ajaxResult) {
var crew = JSON.parse(ajaxResult);
for (var i = 0; i < crew.length; i++) {
var thisCrewMember = crew[i];
debugger;
var getScript = $.get({
url: "templates/CrewPanel.html",
dataType: "text",
data: thisCrewMember
})
.done(function (template) {
debugger;
template = template.replace("[[NAME]]", thisCrewMember.NAME);
document.getElementById("CrewPanels").innerHTML += template;
})
.fail(function () {
alert("Failed to retrieve template: CrewPanel.html");
})
}
},
error: function (result) {
return false;
}
});
有人可以告诉我我正在尝试做的事情是否可能,如果可以,怎么做?
编辑
在代码清单中添加了两个调试器语句。
我不确定这是一个范围界定问题。在执行时,在 Chrome 调试器中,(假设来自通用处理程序的 8 行 JSON 数据),它将在第一个调试器语句上中断 8 次,然后在 done() 回调中的第二个调试器语句上中断 8 次.
当然,当它这样做时,for 循环已经完成了它的迭代,并且 thisCrewMember 位于分配的最后一个值上。
感谢您的评论,但我认为这是一个异步问题,即使我正在回调函数中进行工作。如果没有,有人可以解释问题的范围吗?
编辑 2
我把它收回。按照 PaulPro 的建议更改var
为const
确实可以解决问题。我想我不明白 thisCrewMember 的范围。但建议的改变带来了更好的结果。
解决方案
推荐阅读
- c++ - 无法在 C++ 中创建具有今天日期的文件夹
- performance - 与字典查找相比,Julia Val{c}() 似乎很慢
- wordpress - 如何使用 WP Query 按 slug 模式过滤帖子/页面?
- javascript - 为什么我的条件在我的对象方法中不起作用?
- flutter - 在 Flutter 中使用动态 JSON 数据创建 gridView
- python - Python setup.py 克隆子文件夹并将其用作源代码
- vue.js - 当我已经发送信息时,如何从表中删除一行
- asp.net-core - Entity Framework Core 总是返回一个空列表相关表
- python - 从给定子字符串的列表中查找下一个/上一个项目
- java - spring-boot eureka 客户端错误“无法在任何已知服务器上执行请求”