Вызов двух функций области родительского контроллера из дочернего контроллера, один за другим в angular.js

У меня есть один метод 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');
    });
};

$scope.accountDateUpdate() - это неблокирующая асинхронная функция?

georgeawg 10.09.2018 10:10

@ georgeawg, да, обещаний не возвращает, обновил вопрос кодом для функции accountDataUpdate

user59759 10.09.2018 10:17
0
2
36
1

Ответы 1

Измените 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 - Цепочка обещаний.

Другие вопросы по теме