2016-11-18 14 views
1

私は、次の工場とコントローラがあります。ファクトリメソッドNavAuthは何アンギュラコントローラ/工場間違った順序で

(function() { 
    'use strict'; 
    angular.module('app.core') 
    .factory('Auth', ['$http', function AuthFactory($http) { 

     return { 
      NavAuth: function (Tab) { 
       return $http({ method: 'GET', url: 'Dashboard/AuthorizeNavItem', params: { Name: Tab } }); 
      } 
     } 

    }]); 
})(); 


angular 
.module('myapp') 
.controller('IndexController', ['fuseTheming', 'msNavigationService', 'Auth', function (fuseTheming, msNavigationService, Auth) { 
    var vm = this; 

    //Define the tabs 
    msNavigationService.saveItem('app', { 
     title: 'QPSTool', 
     group: true, 
     weight: 1 
    }); 

    msNavigationService.saveItem('app.dashboard', { 
     title: 'Dashboard', 
     icon: 'icon-tile-four', 
     state: 'app.dashboard', 
     weight: 1 
    }); 

    Auth.NavAuth('IT').success(function (result) { 
     if (result == 'Authorized') { 
      msNavigationService.saveItem('app.it', { 
       title: 'IT', 
       icon: 'icon-monitor', 
       weight: 2 
      }); 
     } 
    }); 

    Auth.NavAuth('Users').success(function (result) { 
     if (result == 'Authorized') { 
      msNavigationService.saveItem('app.it.users', { 
       title: 'Users', 
       state: 'app.it.users', 
       weight: 1 
      }); 
     } 
    }); 

    Auth.NavAuth('Admin').success(function (result) { 
     if (result == 'Authorized') { 
      msNavigationService.saveItem('app.admin', { 
       title: 'Admin', 
       icon: 'icon-radioactive', 
       weight: 3 
      }); 
     } 
    }); 

    Auth.NavAuth('NavControl').success(function (result) { 
     if (result == 'Authorized') { 
      msNavigationService.saveItem('app.admin.navcontrol', { 
       title: 'Navigation Auth', 
       state: 'app.admin.navcontrol', 
       weight: 1 
      }); 
     } 
    }); 

    // Data 
    vm.themes = fuseTheming.themes; 
}]); 

をあるそれがパラメータとしてナビゲーション項目名を取り、ユーザーがあるかどうかを教えてくれるこのアイテムにアクセスできます。

問題は、私がmsNavigationService.saveItemのデータをランダムな順序で返すことをコントローラで使用していることです。したがってNavControlの承認をITの前に返します。

これにより、サイドナビゲーションが正しく表示されなくなります。

コントローラーで指定した順番で動作するようにするにはどうすればよいですか(つまり、もう一方の操作を行うまで待つにはどうすればよいですか)。

+1

これらはすべて保証されているため、その順序は保証されていません。最善の方法は、結果を配列に保存するロジックを書き直し、すべての約束を処理するために '$ q.all'のような処理をした後、配列を繰り返し処理して、望む順序でレンダリングします。 – Claies

+0

$ q.all()はすべての約束事を一つの約束事にまとめ、すべての約束事が解決されたときに解決されます。 – jbrown

+0

を補足してください。 '.success()'は[deprecated](https://github.com/angular/angular.js/pull/15157)となっており、[1.6で完全に削除されました] (https://github.com/angular/angular.js/commit/b54a39e2029005e0572fbd2ac0e8f6a4e5d69014)。あなたは '.then()'を使うべきですが、この場合は 'call.then(makeAnother()。then(makeAnother())then(makeAnother())))'を使うのはお勧めできません。汚い。 – Claies

答えて

1

私はあなたの問題は$q.allではなく、約束のthen一部を置くことによって解決されないだろうと思うので、あなたが実行されるコードを強制約束のthen

NavAuth('IT').then(function (res) { 
    // doWhatever IT function does; 
    ... 
    NavAuth('NavControl').then(function (res) { 
    // doWhatever NavControl function does; 
    ... 
    }) 
}) 

ような何かをするだろう$q.all()と入力すると、$q.all()に渡す約束がすべて完了するまで、すべてを実行することはありません。

+1

これは非常にうまくいった私の目的。前に試しましたが、私の実装は途方に暮れていました。 ありがとう! – DevShadow

1

約束を特定の順序で実行したい場合は、.then()を使用して約束します。一度にすべてを行い、次に適切に発注する場合は、.all()を使用して約束を解決し、データを注文してください。

+0

解決済みの約束のすべてのデータを一度に渡すことができれば、同時にそれらをすべて同時に起動することができます。これは 'then'を使用して連続したものよりも速くなります –

関連する問題