首页 > 代码库 > jQuery:在一个回调中处理多个请求

jQuery:在一个回调中处理多个请求

我曾经为Mozilla Developer Network 开发一个新功能,它需要加载一个基本的脚本文件的同时加载一个JSON请求。因为我们使用的是jQuery,意味着要使用 jQuery.getScript和jQuery.getJSON。我知道这两者都是异步的并返回一个Deferred(jQuery中的Promise模式实现, 参见: deffered object)对象,因此我想知道能不能在一个回调里按顺序请求它们,就像多数的JavaScript加载器那样(如curljs )。我很幸运,使用jQuery就可以用一个回调处理两个请求。

  jQuery的JavaScript代码

  就像我刚才提到的,我需要加载一个脚本和一个JSON文件,就像这样:

$.when(
  $.getScript(‘/media/js/wiki-min.js?build=21eb633‘),
  $.getJSON(‘https://developer.mozilla.org/en-US/demos/feeds/json/featured/‘)
).then(function(a, b) {
    // 或者 ".done"
    // 好了,东西都加载好了,可以干活了

});

  当资源文件加载完时,done或者callback就会被触发,我就知道已经请求完了。每一个请求都返回了不同的回调参数,如上面的返回参数就像这样:

// [response, state, jqxhr], [response, state, jqxhr]
["(function(c){var e=c(".from-search-navigate");if(e…;if(j){g.apply(m,l)}}}})(window,document,jQuery);", "success", Object] [Array[15], "success", Object]

  如果我们希望再加载一个传统的Ajax请求,就像获取一个HTML模板,我们可以这样:

$.when(
    $.getScript(‘/media/js/wiki-min.js?build=21eb633‘),
    $.getJSON(‘https://developer.mozilla.org/en-US/demos/feeds/json/featured/‘),
    $.get(‘/‘)
).then(function(a, b, c) {
    console.log(a, b, c);
});

  Dojo Toolkit很早以前就有类似的功能了,但是我不知道现代jQuery也可以。在一个回调中处理多个请求在请多场合需要用到,可以看出jQuery也在与时俱进。

  原文 davidwalsh.name

 

<iframe id="google_ads_frame2" vspace="0" height="250" marginHeight="0" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3447371224873639&output=html&h=250&slotname=8660799060&adk=1970350646&w=300&lmt=1401219357&flash=0&url=http%3A%2F%2Fwww.cnblogs.com%2Franzige%2Fp%2F3754997.html&dt=1401219360238&shv=r20140520&cbv=r20140417&saldr=sb&correlator=1401219360085&frm=20&ga_vid=1304086684.1400769066&ga_sid=1401204879&ga_hid=60724104&ga_fc=1&u_tz=480&u_his=635&u_java=1&u_h=768&u_w=1364&u_ah=740&u_aw=1364&u_cd=16&u_nplug=0&u_nmime=0&dff=tahoma&dfs=12&adx=0&ady=1127&biw=314&bih=74&eid=317150304&oid=3&rx=0&eae=0&docm=9&vis=0&fu=0&ifi=2&xpc=TgdWl5CTMT&p=http%3A//www.cnblogs.com&dtd=51" frameBorder="0" width="300" allowTransparency="true" name="google_ads_frame2" marginWidth="0" scrolling="no" hspace="0"></iframe><iframe id="google_ads_frame3" vspace="0" height="250" marginHeight="0" src="http://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3447371224873639&output=html&h=250&slotname=8660799060&adk=1970350646&w=300&lmt=1401219357&flash=0&url=http%3A%2F%2Fwww.cnblogs.com%2Franzige%2Fp%2F3754997.html&dt=1401219360296&shv=r20140520&cbv=r20140417&saldr=sb&prev_slotnames=8660799060&correlator=1401219360085&frm=20&ga_vid=1304086684.1400769066&ga_sid=1401204879&ga_hid=60724104&ga_fc=1&u_tz=480&u_his=635&u_java=1&u_h=768&u_w=1364&u_ah=740&u_aw=1364&u_cd=16&u_nplug=0&u_nmime=0&dff=tahoma&dfs=12&adx=304&ady=1377&biw=314&bih=74&eid=317150304&oid=3&rx=0&eae=0&docm=9&vis=0&fu=0&ifi=3&xpc=ksYi1bM4GJ&p=http%3A//www.cnblogs.com&dtd=46" frameBorder="0" width="300" allowTransparency="true" name="google_ads_frame3" marginWidth="0" scrolling="no" hspace="0"></iframe>