Вызов функции родительского контроллера из дочернего контроллера, один за другим в angular.js - PullRequest
0 голосов
/ 10 сентября 2018

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

1 Ответ

0 голосов
/ 10 сентября 2018

Изменить 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 - Обещания цепочки .

...