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

时间:2014-06-29 15:48:47

标签: jquery indexeddb deferred ydn-db

根据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存储对象的全局变量,在脚本顶部获得(此处未显示)。

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

  2. 函数调用file2store是否会排队,这意味着,确保在下一个调用开始之前完成一个调用?

1 个答案:

答案 0 :(得分: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是否会排队,这意味着,确保一个调用在下一个调用完成之前完成?

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