当接收到AJAX内容时,每次$.的下一次迭代
Next iteration of $.each when received AJAX-content
这个问题以前也有人问过,但现在已经差不多四年了,也许有更好的解决方案。
我有一个$.each循环,有时会通过ajax获取额外的数据。
我正在用提取的数据构建一个对象,在循环之后,有一个函数可以从该对象生成HTML问题是循环在ajax数据到达之前就完成了如果我在HTML生成函数中放置警报,则内容加载正常。
我正在寻找一种解决方案,它只在循环和所有ajax调用完成时调用HTML生成器函数。也许计算已启动的Ajax请求并等待所有请求完成是一种解决方案?
我相信jQuery deferred对我来说是正确的解决方案,但我只找到了所有事情都在循环中的例子。有人能帮忙吗?
我把我的代码精简为最重要的东西:
//goes through each testplace -->main loop
$.each(jsobject, function(key, value)
{
//build object together...
for (var i = 0, numComputer = jenkinsComputer.contents.computer.length; i < numComputer; i++)
{
//If the testplace is in both objects then fire AJAX request
if (jenkinsComputer.contents.computer[i].displayName == key) //<<<This can happen only once per $.each loop, but it does not happen every time
{
//next $.each-iteration should only happen when received the JSON
var testplaceurl = jenkinsComputer.contents.computer[i].executors[0].currentExecutable.url;
$.when($.getJSON("php/ba-simple-proxy.php?url=" + encodeURI(testplaceurl) + "api/json?depth=1&pretty=1")).done(function(jenkinsUser)
{
//build object together...
});
}
}
}); //End of main Loop ($.each)
generateHTML(builtObject);
如果有人能给我一个如何做的建议就太好了。
我会这样做:
var thingstodo = $(jsobject).length;
var notfired = true;
$.each(jsobject, function(key, value)
{
//build object together...
for (var i = 0, numComputer = jenkinsComputer.contents.computer.length; i < numComputer; i++)
{
//If the testplace is in both objects then fire AJAX request
if (jenkinsComputer.contents.computer[i].displayName == key) //<<<This can happen only once per $.each loop, but it does not happen every time
{
//next $.each-iteration should only happen when received the JSON
var testplaceurl = jenkinsComputer.contents.computer[i].executors[0].currentExecutable.url;
$.when($.getJSON("php/ba-simple-proxy.php?url=" + encodeURI(testplaceurl) + "api/json?depth=1&pretty=1")).done(function(jenkinsUser)
{
//build object together...
thingstodo--;
if(thingstodo === 0 && notfired){
notfired = false;
generateHTML(buildObject);
}
});
}else{
thingstodo--;
}
}
}); //End of main Loop ($.each)
if(thingstodo === 0 && notfired){
generateHTML(buildObject);
}
这是一个关于解决方案的未经测试的简短示例。我希望这能给你一个想法。
// I guess that jsobject is array ..
// if it is not object you can use something like:
// var keys = Object.getOwnPropertyNames(jsobject)
(function () {
var dfd = $.Deferred();
function is_not_finished() {
return jsobject.length > 0 && jenkinsComputer.contents.computer.length > 0;
}
(function _handleObject() {
var key = jsobject.shift();
var displayName = jenkinsComputer.contents.computer.shift().displayName;
if (displayName == key) //<<<This can happen only once per $.each loop, but it does not happen every time
{
//next $.each-iteration should only happen when received the JSON
var testplaceurl = jenkinsComputer.contents.computer[i].executors[0].currentExecutable.url;
$.getJSON("php/ba-simple-proxy.php?url=" + encodeURI(testplaceurl) + "api/json?depth=1&pretty=1").done(function(jenkinsUser)
{
//build object together...
if(is_not_finished()) {
setTimeout(_handleObject,0);
} else {
dfd.resolve();
}
});
} else if (is_not_finished()) {
setTimeout(_handleObject,0);
} else {
dfd.resolve();
}
}());
return dfd.promise();
}()).done(function () {
generateHTML(builtObject);
});
相关文章:
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- JS迭代一个数组,同时更改另一个数组
- 在js中迭代一个数组,同时只将整数复制到另一个数组
- 当接收到AJAX内容时,每次$.的下一次迭代
- 为什么这个 JavaScript switch 语句(在 for 循环内)保留了上一次迭代的值
- 异步mongodb更新循环中最后一次迭代后的重定向
- for循环只迭代一次
- 使用 promises/dedelay 异步迭代一组文件
- 当我将src附加到图像时,每N秒迭代一次
- 当试图从元素中删除类时,For循环只迭代一次
- 不能让.offset()方法在迭代一组列表项时工作
- 每个函数在XML中迭代两次
- 对对象数组只迭代一次
- Javascript - for循环只迭代一次
- Angular ng-option:迭代一个数字数组,以显示另一个数组的内容,但在ng-model中选择了索引
- 迭代一个数并按降序排列
- 迭代一周中的每一天
- 迭代一次的行值并添加
- 自定义JSON.stringify不能对整个对象进行stringify,但在迭代一层时有效
- JavaScript在同一循环中每x次迭代一次循环