【问题标题】: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 对象的全局变量,在脚本顶部获得(此处未显示)。

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

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

【问题讨论】:

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

标签: jquery indexeddb deferred ydn-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 对您的回答的后续意见。干杯!
猜你喜欢
  • 2015-02-20
  • 2013-06-22
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 2014-01-29
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多