异步调用在另一个异步调用的回调中

时间:2018-05-14 17:27:33

标签: javascript ajax asynchronous

我熟悉异步javascript调用的细微差别。所有使用异步调用返回的数据的工作必须在回调中完成。罗杰那个。

在下面的代码中,我的.ajax()调用从C#泛型处理程序中检索机组成员的序列化列表,并且回调包含.get()(也是异步),它检索模板和将每个机组成员的数据与html模板合并,并将其注入页面。

一切正常,但是,最后,循环的每次迭代结束,页面上插入的每个面板仅包含列表中最后一个机组成员的数据。

所以,我最终在页面上的所有面板都是针对同一个人的。列表中的最后一个人。

.get()是在.ajax()的回调中发出的。该工作正在内部.done()的{​​{1}}回调中执行。

我认为这应该是安全的。我们正在.get()调用的回调中完成工作,并且正在.ajax()的{​​{1}}回调中执行该数据的处理。

循环触发所有“1到n”次。然后.done()回拨“1到n”次。

我怀疑即使在for循环中调用.get(),for循环也不是异步,并且在某处出现了问题。

.done()

有人可以告诉我,我想做的事情是否可能,如果是的话,怎么做?

修改

将两个调试器语句添加到代码清单中。

我不确定这是一个范围问题。在执行时,在Chrome调试器中(假设来自通用处理程序的8行JSON数据),它将在第一个调试器语句中中断8次,那么它会在done()回调中的 second 调试器语句中断8次。

当它执行此操作时,当然,for循环已经完成了迭代,而thisCrewMember位于最后分配的值上。

感谢您的评论,但我认为这是一个异步问题,即使我正在回调函数中工作。如果没有,有人可以解释范围界定的问题吗?

编辑2

我把它拿回来。将PaulPro建议的.get()更改为$.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; } }); 确实可以解决问题。我想我不明白th​​isCrewMember是如何确定范围的。但建议的改变带来了更好的结果。

0 个答案:

没有答案