2016-08-12 128 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);   
     });