1

我有以下。

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 )”表示我将异步设置为 false。我知道这可能效率低下。我希望同时加载所有呼叫。唯一的问题是,如果我没有将它们设置为 async false,我的代码的第二部分可能会在填充下拉列表之前执行。

我已经尝试过几次使用 Jquery Deferreds 的尝试,但它们导致了我只能描述为流产的结果。

我想要实现的唯一一件事是查找调用在我的代码的 adimport/第二部分之前完成,以任何顺序......但是让每个调用等待它之前的一个调用完成 EG:异步,似乎我能够体面地实现 ATM 的唯一解决方案。

这将是延迟函数的合适位置吗?谁能指出我可以弄清楚如何正确实现它的方向,因为我以前从未这样做过?

4

2 回答 2

3

您可以使用$.when将多个 Promise 组合为一个在所有 Promise 都已实现时解析的 Promise。如果我理解正确,你想要

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);
于 2013-07-17T12:58:55.917 回答
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 调用不依赖于第一个调用,您可以将它们添加到另一个延迟中。

于 2013-07-17T13:00:48.290 回答