在 Javascript 和 Angular 中链接承诺
Chaining promises in Javascript and Angular
我正在使用 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 中加载数据,但我只想在所有三个功能都正确完成时显示它们。我想我必须链接承诺的结果。我该怎么做?
您可以像这样链接它们:
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]).then(...);
@terpinmd 是正确的。链接承诺非常简单。假设您有一个 "getWidgets" 的服务,return 是一个承诺,并且您想使用该服务的响应来调用另一个服务,"getWidgetOwners",它将 return 另一个承诺:
假设
- getWidgets return一个小部件对象数组。
- 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);
});
我正在使用 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 中加载数据,但我只想在所有三个功能都正确完成时显示它们。我想我必须链接承诺的结果。我该怎么做?
您可以像这样链接它们:
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]).then(...);
@terpinmd 是正确的。链接承诺非常简单。假设您有一个 "getWidgets" 的服务,return 是一个承诺,并且您想使用该服务的响应来调用另一个服务,"getWidgetOwners",它将 return 另一个承诺:
假设
- getWidgets return一个小部件对象数组。
- 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); });