jQuery.when() 是不是对这些函数调用进行排队?

Posted

技术标签:

【中文标题】jQuery.when() 是不是对这些函数调用进行排队?【英文标题】:Does jQuery.when() queue these function calls?jQuery.when() 是否对这些函数调用进行排队? 【发布时间】:2014-08-20 02:10:01 【问题描述】:

根据 jQuery 文档:

To execute a function after two ajax requests are successful:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1,  a2)
/* a1 and a2 are arguments resolved for the 
    page1 and page2 ajax requests, respectively */
   var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
  if ( /Whip It/.test(jqXHR.responseText) ) 
  alert("First page has 'Whip It' somewhere.");

);

我有这个:

    $.when(
        file2store('resources/states_obj.txt?v=2', 'states'),
        file2store('resources/lgas_obj.txt?v=2', 'lgas'),
        file2store('resources/villages_obj.txt?v=2', 'villages'),
        file2store('resources/staff_obj.txt?v=2', 'staff')
    ).done(function()
            console.log('All data put');
    ); 


    function file2store(url, store_name)
        $.getJSON(url, function(obj) 

            db.put(store_name, obj).then(
              function(ids) 
                console.log(store_name+': '+ids.length + ' items put.');
              , function(e) 
                throw e;
              
            );

        );
    

ajax 回调中的变量db 是indexedDB Storage 对象的全局变量,在脚本顶部获得(此处未显示)。

    这是 jQuery Deferred 构造的正确用法吗?

    函数调用file2store 是否会排队,也就是说,确保一个调用在下一个调用之前完成?

【问题讨论】:

一个没有显式返回语句的函数返回undefined,正如所写的那样,这就是file2store 的作用。 jQuery.when() 接受 Promise 作为其参数,因此要使您的代码正常工作,file2store 必须返回一个 Promise - 即 return db.put(...).then(...); 旁注...希望您知道 indexedDB.open 也是异步的,并且您的“db”变量不能保证在您访问它的时间点被定义和打开。 【参考方案1】:

这是 jQuery Deferred 构造的正确用法吗?

不完全是。 when() 方法接受 deferred 对象,该对象是从创建 AJAX 请求的 jQuery 方法返回的。因此,您需要 return 该对象才能使您的代码正常工作:

function file2store(url, store_name)
    return $.getJSON(url, function(obj)  // note the return here.
        // rest of your code... 
    );


函数调用 file2store 是否会排队,也就是说,确保一个调用在下一个调用开始之前完成?

没有。它们是按照您提供它们的顺序创建的,但是它们将按照服务器响应它们的任何顺序完成。

【讨论】:

我明白了。然后返回的 jqXHR 对象可以作为.done(function(a, b, c, d) //do stuff with a, b, c or d ); 传递。因此,除了您提出的观点之外,db.put()$.ajax() 异步例程中的嵌套异步例程如何影响事物?例如。数据可以从它内部返回到外部范围???猜猜不是,Outch!!! 跟进:我猜db.put()确实应该从那个内部范围中提取出来,而是我们应该这样做:.done(function(a, b, c, d) //pass the respective response JSON obj to its own db.put()` 在这个地方);` .对吗? 我不得不接受你的回答,因为我认为它实际上是正确的,解决了我提出的具体问题。在引导我找到最终解决方案方面也非常有用。不过,必须说,我一直在期待关于我最后几个 cmets 对您的回答的后续意见。干杯!

以上是关于jQuery.when() 是不是对这些函数调用进行排队?的主要内容,如果未能解决你的问题,请参考以下文章

有条件地添加到 jQuery .when

jQuery源代码学习之五——jQuery.when

jQuery.when 理解

jQuery异步框架探究3:jQuery.when方法

jQuery异步框架探究3:jQuery.when方法

我可以将 Promises 传递给 jQuery.when(),还是只传递 Deferreds?