Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 下一次迭代$。每次收到AJAX内容时_Javascript_Jquery_Ajax_Asynchronous_Jquery Deferred - Fatal编程技术网

Javascript 下一次迭代$。每次收到AJAX内容时

Javascript 下一次迭代$。每次收到AJAX内容时,javascript,jquery,ajax,asynchronous,jquery-deferred,Javascript,Jquery,Ajax,Asynchronous,Jquery Deferred,问题已经解决了,但已经过去了将近四年,也许有更好的解决办法 我有一个$。每个循环,有时通过ajax获取额外的数据 我正在用获取的数据构建一个对象,在循环之后有一个函数可以从该对象生成HTML问题在于,循环在ajax数据到达之前完成。如果我在HTML生成函数中放置了一个警报,则内容加载正确 我正在寻找一种仅在循环和所有ajax调用完成时才调用HTML生成器函数的解决方案。也许这是一种计算已启动的Ajax请求并等待所有请求都完成的解决方案 我相信jquerydeferred对我来说是正确的解决方案,

问题已经解决了,但已经过去了将近四年,也许有更好的解决办法

我有一个$。每个循环,有时通过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;iif(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;iif(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。