2016-08-12 187 views
0

我採用了棱角分明國土資源從一個API得到我的數據,這種方式:鏈接的承諾和角

var getAccountListPerUser = function() { 

    return $resource(uri, {}, { 
    get: { 
     headers: service.getDefaultHeaderRequest(), 
     method: 'GET', 
     transformResponse: function (data) { 
     var accountList = []; 
     try { 
      accountList = JSON.parse(data); 
     } catch (e) { 
      accountList = []; 
     } 
     return accountList; 
     }, 
     isArray: true, 
     cache: true 
    } 
    }).get().$promise; 
}; 

在我的控制器我不得不使用它,並在同一個定義的另外兩個服務功能辦法。

var promiseResourcesAccountList = usrWebUserService.getAccountListPerUser(); 

promiseResourcesAccountList.then(function(result){ 
    $scope.usersWithAccountsAndProfiles = result; 
    var filteredProfiles = []; 
    for (var account in result) { 
    ... 
    } 
    $scope.filteredProfiles = filteredProfiles; 
}); 

和:

var promiseResourcesEditUser = usrWebUserService.getResourcesUser(currentUser); 

promiseResourcesEditUser.then(function (result) { 
    usrWebUserFactory.mapBasicPreferences($scope, result); 
}); 

然後又是非常相似的,在三個div的信息加載數據,但我只想告訴他們,當所有的三個功能都正確完成。我想我必須將承諾的結果連鎖起來。我怎樣才能做到這一點?

+2

使用'Promise.all([你的承諾的陣列])'。 [Here](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)文檔。 –

回答

1

你可以把它們連想:

promiseResourcesAccountList.then(function(result){ 
    ///whatever processing 
    //return a promise 
    return promiseResourcesEditUser() 
}).then(function(){ 
    return anotherPromise(); 
}).then(function(){ 
    //update scope here 
}); 

或者,你也可以使用$ q.all([promise1,promise2,promise3]),然後(...)。

0

@terpinmd是正確的。鏈接承諾非常簡單。假設你有一個服務,它返回一個承諾一「的getWidgets」,和您想要使用該服務的響應來調用其他服務,「getWidgetOwners」,將返回另一個承諾:

假設

  1. getWidgets返回一個widget對象數組。
  2. getWidgetOwners接受ownerIds

如何數組:

 

    service.getWidgets() 
     .then(function(widgets) { 
      return widgets.map(function(widget) { // extract ownerIds 
       return widget.ownerId; 
      }); 
     }) 
     .then(service.getWidgetOwners)   // pass array of ownerId's to  
     .then(function(owners) {     // the next service 
      console.log(owners);   
     });