Jquery延期。多个ajax调用。延迟vs异步错误

时间:2013-07-17 12:24:46

标签: javascript jquery jquery-deferred deferred

我有以下内容。

var lookupInit = function () {            
        http.get('api/employmenttype', null, false)
            .done(function (response) {
                console.log('loaded: employmenttype');
                vm.lookups.allEmploymentTypes(response);
            });    
        http.get('api/actionlist', null, false)
            .done(function (response) {
                console.log('loaded: actionlist');
                vm.lookups.allActionListOptions(response);
            });    
        http.get('api/company', null, false)
            .done(function (response) {
                console.log('loaded: company');
                vm.lookups.allCompanies(response);
            });    

        //... x 5 more
        return true;
    };



// somewhere else
  if (lookupInit(id)) {
        vm.userInfo.BusinessUnitID('0');
        vm.userInfo.BuildingCode('0');

          if (id === undefined) {
                console.log('api/adimport: latest');
                http.json('api/adimport', { by: "latest" }, false).done(viewInit);
          }
          else if (id !== undefined) {
                console.log('api/adimport: transaction');
                http.json('api/adimport', { by: "transaction", TransactionId: id }, false).done(viewInit);
          }
  } else {
      console.log('User info init failed!');
  }

以下“http.get('api / employmenttype',null, false )”表示我将async设置为false。 我知道这可能效率低下。我希望所有的呼叫同时加载。 唯一的问题是如果我没有将它们设置为async false,我的代码的第二部分可能会在填充下拉列表之前执行。

我尝试过Jquery Deferreds的几次尝试,但是他们已经导致我只能描述为堕胎。

我唯一想要实现的是查询调用在我的代码的adimport / second部分之前以任何顺序完成....但是每次调用都要等到它之前完成EG:async ,似乎是我能够实现体面ATM的唯一解决方案。

这是一个适合延期功能的地方吗?任何人都可以指出我可以弄清楚如何正确实现它的方向,因为我以前从未这样做过吗?

2 个答案:

答案 0 :(得分:3)

您可以使用$.when将多个承诺合并到一个承诺完成所有承诺时解决的承诺。如果我找对你,你想要

function lookupInit() {            
    return $.when(
        http.get('api/employmenttype').done(function (response) {
            console.log('loaded: employmenttype');
            vm.lookups.allEmploymentTypes(response);
        }),
        http.get('api/actionlist').done(function (response) {
            console.log('loaded: actionlist');
            vm.lookups.allActionListOptions(response);
        }),
        http.get('api/company').done(function (response) {
            console.log('loaded: company');
            vm.lookups.allCompanies(response);
        }),
        // … some more
    );
}

然后在其他地方

lookupInit(id).then(function(/* all responses if you needed them */) {
    vm.userInfo.BusinessUnitID('0');
    vm.userInfo.BuildingCode('0');

    if (id === undefined) {
         console.log('api/adimport: latest');
         return http.json('api/adimport', {by:"latest"})
    } else {
         console.log('api/adimport: transaction');
         return http.json('api/adimport', {by:"transaction", TransactionId:id});
    }
}, function(err) {
    console.log('User info init failed!');
}).done(viewInit);

答案 1 :(得分:1)

在Jquery API中,我发现了解决多个延迟的问题:

$.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.
        each argument is an array with the following
        structure: [ data, statusText, jqXHR ] */
    var data = a1[0] + a2[0]; /* a1[0] = "Whip", a2[0] = " It" */
    if ( /Whip It/.test(data) ) {
        alert("We got what we came for!");
    }
});

将此与您的代码一起使用:

var defer = $.when(
    $.get('api/employmenttype'),
    $.get('api/actionlist'),
    $.get('api/company'),
    // ... 5 more
);

defer.done(function (arg1, arg2, arg3 /*, ... 5 more*/) {
    vm.lookups.allEmploymentTypes(arg1[0]);
    vm.lookups.allEmploymentTypes(arg2[0]);
    vm.lookups.allEmploymentTypes(arg3[0]);
    // .. 5 more

    vm.userInfo.BusinessUnitID('0');
    vm.userInfo.BuildingCode('0');

    if (id === undefined) {
        console.log('api/adimport: latest');
        http.json('api/adimport', { by: "latest" }, false).done(viewInit);
    } else if (id !== undefined) {
        console.log('api/adimport: transaction');
        http.json('api/adimport', { by: "transaction", TransactionId: id }, false).done(viewInit);
    }
});

你可以在其他$ .when()中使用$ .when()的延迟,所以如果json调用不依赖于第一次调用,你可以将它们添加到onther延迟中。