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 )」は、async を false に設定したことを意味します。これはおそらく非効率的であることを認識しています。そして、すべての呼び出しを同時にロードしたいと思います。唯一の問題は、それらを async false に設定していない場合、ドロップダウンが設定される前にコードの 2 番目の部分が実行される可能性があることです。

私は Jquery Deferreds でいくつかの試みを試みましたが、中絶としか言いようのない結果になりました。

私が達成しようとしている唯一のことは、任意の順序でコードの adimport/2 番目の部分の前にルックアップ呼び出しが終了することです。私がきちんとATMを実装できる唯一の解決策です。

これは遅延関数の適切な場所でしょうか?また、これまでに行ったことがないので、正しく実装する方法を理解できる方向に誰かが私を向けることができますか?

4

2 に答える 2

1

Jquery API では、複数の deferred の解決について次のことがわかりました。

$.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() の defer を使用できるため、json 呼び出しが最初の呼び出しに依存していない場合は、それらを onther defer に追加できます。

于 2013-07-17T13:00:48.290 に答える