嵌套异步调用似乎未按预期执行
Nested asynchronous calls do not seem to execute as expected
在尝试jQuery时,我有一个问题可能是新手的错误,但我似乎找不到解决方案。这是代码:
$.get("index.html", function() {
var i = 0;
for (; i < 3; i++)
{
var lDiv = document.createElement('div');
lDiv.id = 'body-' + i;
document.getElementById('body').appendChild(lDiv);
$.get('index.html', function(data) {
lDiv.innerHTML = "<p>Hello World " + i + "</p>";
});
}
});
输出似乎是
<div id='body-0'></div>
<div id='body-1'></div>
<div id='body-2'>
<p>Hello World 3</p>
</div>
我希望为每个 i 执行lDiv.innerHTML=
代码,但显然它只针对最后一个 i 执行?我忽略了什么?
发生这种情况是因为循环在触发任何回调之前完成(i
为 2)。
@thecodeparadox的解决方案有效,但它序列化 HTTP 请求。 (使它们一次发射一个。 这允许请求并行执行,因此速度更快:
for (var i = 0; i < 3; i++)
{
var lDiv = document.createElement('div');
lDiv.id = 'body-' + i;
document.getElementById('body').appendChild(lDiv);
$.get('index.html', function(i,lDiv) { // the current iteration's `i` and `lDiv` are captured...
return function(data) {
lDiv.innerHTML = "<p>Hello World " + i + "</p>";
}
}(i,lDiv)); // ...by passing them as an argument to the self-executing function
}
由于$.get()
是异步的,所以你需要在$.get()
的success()
回调函数中执行追加和下一次调用。
var i = 0;
function recursiveLoad() {
if(i == 3) return;
var lDiv = document.createElement('div');
lDiv.id = 'body-' + i;
document.getElementById('body').appendChild(lDiv);
$.get('index.html', function(data) {
lDiv.innerHTML = "<p>Hello World " + i + "</p>";
i++;
recursiveLoad();
});
}
// initial call
recursiveLoad();
相关文章:
- 带延迟串行执行异步函数
- 单击链接时执行异步AJAX调用,然后跟随该链接
- 我们可以使用Jasmine在测试中执行异步操作吗
- 如何在循环中对 es6 生成器执行异步任务
- $.when.apply.done 不执行异步函数
- 了解在Selenium中执行异步脚本
- setTimeout 是使用 javascript 执行异步函数的好解决方案吗?
- 如何在 $ 中执行异步操作.延迟,然后失败过滤回调并传递回成功链
- 如何使用 Q.js 在循环中执行异步函数
- 执行异步代码时;退出“;事件
- 如何按顺序执行异步Mocha测试(NodeJS)
- 一个接一个地执行异步进程
- 在调用函数之前执行异步调用
- 在NodeJ中执行异步卷曲的最佳方式
- 正在同步执行异步函数
- 在Express2.x中的dynamicHelper(或其他选择)中执行异步调用
- 如果执行异步操作,将产生表达式块
- 执行异步操作后的函数
- Angular在ng-click中执行异步函数
- 承诺:如何并行执行异步方法,然后执行方法