Javascript JQuery中的每个函数都不等待内部函数完成
我在一个ajax函数中有这个函数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&
$.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