2013-02-14 117 views
0

我经常需要在加载两到五个适度大小的数据文件之后在网页上加载函数。假设最多5MB文件分割为3MB的数据。用于N ajax调用的Javascript函数

我试图通过使所有的AJAX同时调用并加载一个initialize()函数来优化加载时间他们都加载之后,就像这样:

var data1, data2; 
$(document).ajaxStop(function() { 
    $(this).unbind("ajaxStop"); //prevent running again when other calls finish 
    initialize(); 
}); 

$.ajax({ 
    url: url_to_data_1, 
    success: function (d) { 
     data1 = d; 
    } 
}); 

$.ajax({ 
    url: url_to_data_2, 
    success: function (d) { 
     data2 = d; 
    } 
}); 

function initialize() { /* do something with data1 and data2 */ } 

但我厌倦了在每一次粘贴此,所以我想这样的函数:

function multi_Ajax(urls, callback) { 
    var data = {}; 

    //call init() after both the list of prayers and the word concordance index load 
    $(document).ajaxStop(function() { 
     $(this).unbind("ajaxStop"); //prevent running again when other calls finish 
     callback(data); 
    }); 

    for (var c = 0; c < urls.length; c += 1) { 
     //data files 
     $.ajax({ 
      url: urls[c], 
      dataType: "json", 
      success: function (d) { 
      data[urls[c]] = d; console.log("Loaded " + urls[c]); 
      } 
     }); 
    }  
} 

这是不行的,当然,因为不存在Ajax调用的ajaxStop赶上。但我不明白ajaxStop的工作方式是否足够好以进一步获得更多。谢谢!

+0

我想你正在寻找'$ .when()'。 – Barmar 2013-02-14 16:34:24

+0

你是什么意思“ajax调用不存在为ajaxStop捕捉?” – 2013-02-14 16:36:43

+0

谢谢 - 可以当()采取动态输入?说,一个循环填充的东西? EP - 我的意思是如果ajax调用是在循环中创建的,ajaxStop可以找到它们吗? – 2013-02-14 16:40:19

回答

1

我不确定为什么你的第二次尝试不起作用。根据文档,每当ajax请求完成时,jquery将检查是否还有其他未完成的请求,如果没有其他请求,则会触发ajaxStop。就我所知,在循环中调用$.ajax应该与每个调用的硬编码没有任何区别。

但是,正如Barmar在评论中建议的那样,$.when看起来像是一种更干净的方式来执行您想要执行的操作。下面是如何通过一个数组(您可以在一个循环填充)到$.when一个例子:Pass in an array of Deferreds to $.when()

使用$.when似乎比$.ajaxStop清洁,因为如果后来有人出现了,之前或你的循环之后的某处增加了一个不相关的ajax请求,这会干扰ajaxStop触发的时间。 $.when允许你明确地说出你想要等待哪个ajax请求。

编辑:这里是显示ajaxStop在一个循环发出多个呼叫工作小提琴:http://jsfiddle.net/zYk5W/

看起来这是不是你无关,与阿贾克斯或.ajaxStop工作的原因;相反,这是成功回调中的范围问题。您的成功回调关闭了c,但这与外部(循环)范围使用的相同c。在任何成功回调运行时,for循环已完成,并且c已增加到urls.length。因此,每次成功回调运行时,urls[c]都是未定义的。请参阅我链接的小提琴或JavaScript closure inside loops – simple practical example以了解如何在与循环的c分开的范围内为每个成功回调提供自己的c的示例。

+0

正是我需要的,谢谢!我应该已经发现了这个范围问题,但使用$ .when()肯定更好。 – 2013-02-14 17:03:48