Javascript 下一次迭代$。每次收到AJAX内容时
问题已经解决了,但已经过去了将近四年,也许有更好的解决办法 我有一个$。每个循环,有时通过ajax获取额外的数据 我正在用获取的数据构建一个对象,在循环之后有一个函数可以从该对象生成HTML问题在于,循环在ajax数据到达之前完成。如果我在HTML生成函数中放置了一个警报,则内容加载正确 我正在寻找一种仅在循环和所有ajax调用完成时才调用HTML生成器函数的解决方案。也许这是一种计算已启动的Ajax请求并等待所有请求都完成的解决方案 我相信jquerydeferred对我来说是正确的解决方案,但我只找到了所有东西都留在循环中的示例。有人能帮忙吗 我已将代码精简到最重要的部分:Javascript 下一次迭代$。每次收到AJAX内容时,javascript,jquery,ajax,asynchronous,jquery-deferred,Javascript,Jquery,Ajax,Asynchronous,Jquery Deferred,问题已经解决了,但已经过去了将近四年,也许有更好的解决办法 我有一个$。每个循环,有时通过ajax获取额外的数据 我正在用获取的数据构建一个对象,在循环之后有一个函数可以从该对象生成HTML问题在于,循环在ajax数据到达之前完成。如果我在HTML生成函数中放置了一个警报,则内容加载正确 我正在寻找一种仅在循环和所有ajax调用完成时才调用HTML生成器函数的解决方案。也许这是一种计算已启动的Ajax请求并等待所有请求都完成的解决方案 我相信jquerydeferred对我来说是正确的解决方案,
//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);
//遍历每个testplace-->主循环
$.each(对象、函数(键、值)
{
//一起构建对象。。。
for(var i=0,numComputer=jenkinsComputer.contents.computer.length;i if(jenkinsComputer.contents.computer[i].displayName==key)/这是一个关于该解决方案的未经测试的简短示例。我希望这能让您有所了解
// 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);
});
//我猜jsobject是数组。。
//如果不是对象,则可以使用以下内容:
//var keys=Object.getOwnPropertyNames(jsobject)
(功能(){
var dfd=$.Deferred();
函数未完成(){
返回jsobject.length>0&&jenkinsComputer.contents.computer.length>0;
}
(函数_handleObject(){
var key=jsobject.shift();
var displayName=jenkinsComputer.contents.computer.shift().displayName;
if(displayName==key)/这是一个关于解决方案的未经测试的简短示例。我希望这能给你一些想法
// 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);
});
//我猜jsobject是数组。。
//如果不是对象,则可以使用以下内容:
//var keys=Object.getOwnPropertyNames(jsobject)
(功能(){
var dfd=$.Deferred();
函数未完成(){
返回jsobject.length>0&&jenkinsComputer.contents.computer.length>0;
}
(函数_handleObject(){
var key=jsobject.shift();
var displayName=jenkinsComputer.contents.computer.shift().displayName;
如果(displayName==key)/我会这样做:
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);
}
var thingstodo=$(jsobject).length;
var notfired=true;
$.each(对象、函数(键、值)
{
//一起构建对象。。。
for(var i=0,numComputer=jenkinsComputer.contents.computer.length;i 如果(jenkinsComputer.contents.computer[i].displayName==key)/我会这样做:
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);
}
var thingstodo=$(jsobject).length;
var notfired=true;
$.each(对象、函数(键、值)
{
//一起构建对象。。。
for(var i=0,numComputer=jenkinsComputer.contents.computer.length;i if(jenkinsComputer.contents.computer[i].displayName==key)//只是一个小提示:循环中的AJAX从来都不是一个好主意。它可能看起来更简单,但最好让服务器端执行循环。整个脚本都在我们的本地网络上运行,大多数时候只有5-10个短AJAX调用,所以这里没有网络问题。如果有javascript解决方案,那就太好了。稍微le提示:循环中的AJAX从来都不是一个好主意。它可能看起来更简单,但最好让服务器端执行循环。整个脚本都在我们的本地网络上运行,大多数时候只有5-10个短AJAX调用,因此这里没有网络问题。如果有javascript解决方案,那就太好了。你正在阻止整个脚本在执行ajax请求时执行,而不是让它异步运行。Hmmm。事实上,$。每个都是同步的。如果接收数据的顺序不重要,因为您同时发送请求,那么您的解决方案是可以的。这里的关键是“接收时的下一次迭代”。我们还可以开发类似于$.eachAsinc的东西,它依赖于promise。同样,在您的情况下,$.when是不必要的,因为$.getJSON返回promise。在执行ajax请求时,您会阻止整个执行,而不是让它异步运行。事实上,$。每个都是同步的。如果接收到的数据序列正确,您的解决方案是正确的不重要,因为您同时发送请求。这里的关键是“接收时的下一次迭代”。我们还可以开发类似于$.eachAsinc的东西,它依赖于promise。在您的情况下,$.when是不必要的,因为$.getJSON返回promise。