У меня есть один метод Angular.js из дочернего контроллера, где он вызывает два метода родительского контроллера один за другим. Но вторая функция должна получить данные учетной записи из первой функции, а затем обновит данные вызова, как показано ниже:
filter.filterAccountsByProductMetrics1 = function(productWithSegmentations12) {
accountService.fetchAccountForRecordType([filter.selectedHcpHco.Name.display])
.then(function(resp) {
$scope.accountDataUpdate({
accounts: resp.data
});
var productId = null;
if (filter.selectedMySetupProduct.Product_vod__c) {
productId = filter.selectedMySetupProduct.Product_vod__c.value;
}
callService.getCallsForProductId(productId)
.then(function(calls) {
filter.filterRecords[filterType.product.value] = calls;
$scope.callDataUpdate({
calls: applyAllFilterOnCalls()
});
});
});
};
Я проверил, что обе функции вызываются, но последовательность не сохраняется. Как сделать так, чтобы две родительские функции вызывались одна за другой.
Обновлено: функция accountDataUpdate:
call.accountDataUpdate = function(accounts) {
call.accounts = accounts;
getCallDetails(getCallIdsFromCallsForFilteredAccount())
.then(function() {
updateProductFrequencyTableData();
updateAccountDetailData(true);
});
updateDailyFrequencyChartData();
updateWeeklyFrequencyChartData();
updateCallFrequencyTableData();
updateAccountFrequencyData();
$timeout(function() {
$scope.$broadcast('updateDoughnutChart');
$scope.$broadcast('updateBarChart');
});
};
@ georgeawg, да, обещаний не возвращает, обновил вопрос кодом для функции accountDataUpdate
Измените accountDataUpdate
, чтобы вернуть обещание:
call.accountDataUpdate = function(accounts) {
call.accounts = accounts;
var promise = getCallDetails(getCallIdsFromCallsForFilteredAccount())
.then(function() {
updateProductFrequencyTableData();
updateAccountDetailData(true);
updateDailyFrequencyChartData();
updateWeeklyFrequencyChartData();
updateCallFrequencyTableData();
updateAccountFrequencyData();
return $timeout(function() {
$scope.$broadcast('updateDoughnutChart');
$scope.$broadcast('updateBarChart');
});
});
return promise;
};
Затем используйте это обещание для цепочки:
filter.filterAccountsByProductMetrics1 = function(productWithSegmentations12) {
return accountService.fetchAccountForRecordType([filter.selectedHcpHco.Name.display])
.then(function(resp) {
return $scope.accountDataUpdate({
accounts: resp.data
});
}).then(function() {
var productId = null;
if (filter.selectedMySetupProduct.Product_vod__c) {
productId = filter.selectedMySetupProduct.Product_vod__c.value;
}
return callService.getCallsForProductId(productId)
}).then(function(calls) {
filter.filterRecords[filterType.product.value] = calls;
return $scope.callDataUpdate({
calls: applyAllFilterOnCalls()
});
});
};
Поскольку вызов метода обещания .then
возвращает новое производное обещание, можно легко создать цепочку обещаний.
Можно создавать цепочки любой длины, и поскольку обещание может быть разрешено с помощью другого обещания (что еще больше отложит его разрешение), можно приостановить / отложить выполнение обещаний в любой точке цепочки. Это позволяет реализовать мощные API.
Для получения дополнительной информации см. Справочник по сервисному API AngularJS $ q - Цепочка обещаний.
$scope.accountDateUpdate()
- это неблокирующая асинхронная функция?