Javascript JQuery中的每个函数都不等待内部函数完成

Javascript JQuery中的每个函数都不等待内部函数完成,javascript,jquery,ajax,Javascript,Jquery,Ajax,我在一个ajax函数中有这个函数 $.each(data['Result'][0], function(Key, Value) { InputGen(Value['Type'], Value['Name'], Value['Other'], Value['Value'], function(Html){ Table = Table + "<tr><td>"+Key+"</td><td>" + Html + "</td&

我在一个ajax函数中有这个函数

$.each(data['Result'][0], function(Key, Value) {
    InputGen(Value['Type'], Value['Name'], Value['Other'], Value['Value'], function(Html){
        Table = Table + "<tr><td>"+Key+"</td><td>" + Html + "</td></tr>";
    });
});
$。每个(数据['Result'][0],函数(键,值){
InputGen(值['Type']、值['Name']、值['Other']、值['Value']、函数(Html){
Table=Table+“”+Key+“”+Html+“”;
});
});
而且,
InputGen
有一个来自另一个ajax函数的回调,但是当我运行这个函数时,循环似乎并没有等待ajax完成。我将如何实现这一点

…循环似乎并不等待ajax完成

不,因为“ajax”中的“a”代表异步;你打电话的时候不会发生这种事,它会在以后发生。但是没有理由使用
$。每个
循环都会知道如何坐在那里等待它完成

如果您不需要它(例如,ajax调用可以重叠,通常应该重叠,除非它们相互依赖)

如果需要每个ajax调用等待前一个调用完成,则不能使用
$。每个
(或者至少,不是以前的方式);相反,使用索引并通过触发下一个请求来响应回调:

// Start with first entry
var index = 0;
var array = data['Result'][0];

// Do the first request
doRequest();

function doRequest() {
    var value = array[index];
    InputGen(value['Type'], value['Name'], value['Other'], value['Value'], function(Html) {
        Table = Table + "<tr><td>"+index+"</td><td>" + Html + "</td></tr>";
        // This request is done, move to the next if any
        if (++index < array.length) {
            doRequest();
        }
    });
}
//从第一个条目开始
var指数=0;
变量数组=数据['Result'][0];
//做第一个请求
doRequest();
函数doRequest(){
var值=数组[索引];
InputGen(值['Type']、值['Name']、值['Other']、值['value']、函数(Html){
Table=Table+“”+index+“”+Html+“”;
//此请求已完成,请转到下一个(如果有)
if(++索引

旁注:在JavaScript中,绝大多数变量和非构造函数都是以小写字母开始命名的:
value
,而不是
value
,等等。因此我在上面使用了
index
array
value

旁注2:
value['Type]
可以更简单地写成
value.Type
。(等等。)

…循环似乎并不等待ajax完成

不,因为“ajax”中的“a”代表异步;你打电话的时候不会发生这种事,它会在以后发生。但是没有理由使用
$。每个
循环都会知道如何坐在那里等待它完成

如果您不需要它(例如,ajax调用可以重叠,通常应该重叠,除非它们相互依赖)

如果需要每个ajax调用等待前一个调用完成,则不能使用
$。每个
(或者至少,不是以前的方式);相反,使用索引并通过触发下一个请求来响应回调:

// Start with first entry
var index = 0;
var array = data['Result'][0];

// Do the first request
doRequest();

function doRequest() {
    var value = array[index];
    InputGen(value['Type'], value['Name'], value['Other'], value['Value'], function(Html) {
        Table = Table + "<tr><td>"+index+"</td><td>" + Html + "</td></tr>";
        // This request is done, move to the next if any
        if (++index < array.length) {
            doRequest();
        }
    });
}
//从第一个条目开始
var指数=0;
变量数组=数据['Result'][0];
//做第一个请求
doRequest();
函数doRequest(){
var值=数组[索引];
InputGen(值['Type']、值['Name']、值['Other']、值['value']、函数(Html){
Table=Table+“”+index+“”+Html+“”;
//此请求已完成,请转到下一个(如果有)
if(++索引

旁注:在JavaScript中,绝大多数变量和非构造函数都是以小写字母开始命名的:
value
,而不是
value
,等等。因此我在上面使用了
index
array
value

旁注2:
value['Type]
可以更简单地写成
value.Type
。(等等。)

这是因为AJAX是异步的。没有什么能等它结束。回调将在调用完成后的某个时间点运行。到那时,您的
$。每个
(以及后面的代码)都已经完成了很长时间

这里的解决办法是使用承诺。这样,您可以在所有AJAX调用完成后运行回调

您可以使用jQuery的
$.Deferred
进行此操作。无需编辑
InputGen()
函数,您可以执行以下操作:

var promises = [];

$.each(data['Result'][0], function(Key, Value) {
    var d = new $.Deferred;

    InputGen(Value['Type'], Value['Name'], Value['Other'], Value['Value'], function(Html){
        d.resolve([Key, Html]);
    });

    promises.push(d.promise());
});

$.when.apply($, promises).done(function(){
    for(var i=0, length=arguments.length; i < length; i++){
        var ele = arguments[i],
            Key = ele[0],
            Html = ele[1];

        Table = Table + "<tr><td>"+Key+"</td><td>" + Html + "</td></tr>";
    }

    // In here is where you can use your updated `Table` variable.
    // You *cannot* use it outside of here, since it was not updated yet
});
var承诺=[];
$.each(数据['Result'][0],函数(键,值){
var d=新的递延美元;
InputGen(值['Type']、值['Name']、值['Other']、值['Value']、函数(Html){
d、 解析([Key,Html]);
});
承诺。推动(d.承诺);
});
$.when.apply($,promissions).done(函数(){
for(var i=0,length=arguments.length;i
这是因为AJAX是异步的。没有什么能等它结束。回调将在调用完成后的某个时间点运行。到那时,您的
$。每个
(以及后面的代码)都已经完成了很长时间

这里的解决办法是使用承诺。这样,您可以在所有AJAX调用完成后运行回调

您可以使用jQuery的
$.Deferred
进行此操作。无需编辑
InputGen()
函数,您可以执行以下操作:

var promises = [];

$.each(data['Result'][0], function(Key, Value) {
    var d = new $.Deferred;

    InputGen(Value['Type'], Value['Name'], Value['Other'], Value['Value'], function(Html){
        d.resolve([Key, Html]);
    });

    promises.push(d.promise());
});

$.when.apply($, promises).done(function(){
    for(var i=0, length=arguments.length; i < length; i++){
        var ele = arguments[i],
            Key = ele[0],
            Html = ele[1];

        Table = Table + "<tr><td>"+Key+"</td><td>" + Html + "</td></tr>";
    }

    // In here is where you can use your updated `Table` variable.
    // You *cannot* use it outside of here, since it was not updated yet
});
var承诺=[];
$.each(数据['Result'][0],函数(键,值){
var d=新的递延美元;
InputGen(值['Type']、值['Name']、值['Other']、值['Value']、函数(Html){
d、 解析([Key,Html]);
});
承诺。推动(d.承诺);
});
$.when.apply($,promissions).done(函数(){
for(var i=0,length=arguments.length;i
您需要某种队列或承诺系统。AJAX是异步的。没有什么能等它结束。回调将在c