链接Javascript和Angular中的承诺

时间:2016-08-12 15:37:14

标签: javascript angularjs chaining

我正在使用Angular资源以这种方式从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 个答案:

答案 0 :(得分:1)

您可以将它们链接起来:

#elem{
    height: 100vh;
}

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

答案 1 :(得分:0)

@terpinmd是对的。链接承诺非常简单。假设你有一个带有“getWidgets”的服务,它返回一个promise,你想使用该服务的响应来调用另一个服务,“getWidgetOwners”将返回另一个promise:

假设

  1. getWidgets返回一个小部件对象数组。
  2. getWidgetOwners接受ownerIds数组
  3. 如何:

    
        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);           
            });