Как отменить обещание с $ q в угловых js - PullRequest
0 голосов
/ 31 мая 2019

У меня есть услуга ниже. Я буду вызывать эту службу каждый раз, когда открываю модель, а затем закрываю модель, а затем открываю другую, предыдущие значения отражаются, и в этом случае я хочу отменить обещание каждый раз, когда закрываю модель.

Я попробовал следующий код,

Модель закрытия. Js

$scope.closeButton = function() {
    DetailDataSvc.storeDefer().resolve()
}

My Service, (DetailDataSvc)

self.storeDefer = function() {
    return self.deferReturn;
};

self.getDetailReportData = function(postData, functionName) {
    var promises = {};

    var d = $q.defer(),
        metricDataType;
    self.deferReturn = $q.defer();
    promises = {
        detailReport: metricDataType,
        recommendedMetrics: DataSvc.getData(_logPrefix + functionName, recommendedMetricUrl),
        metricInfo: DataSvc.getData(_logPrefix + functionName, metricInfoUrl)
    };
    $q.all(promises).then(function(res) {
        $log.debug(_logPrefix + 'getDetailReportData(). Called from %s. $q.all Response (raw): ', functionName, res);
        else {
            if (response && !_.isEmpty(_.get(response, 'largeCard.chartData.dataValues.rows')) && response.overlayEnabled) {
                self.getMetricOverLay(pdata, functionName).then(function(overlayData) {
                    response.largeCard.chartData.overlay = overlayData;
                    d.resolve(response);
                }, function(msg, code) {
                    d.reject(msg);
                    $log.error(_logPrefix + 'getDetailReportData().   Error code: %s.  Error: ', code, msg);
                });
            } else {
                d.resolve(response);
            }
        }


    }, function(msg, code) {
        d.reject(msg);
        $log.error(_logPrefix + 'getDetailReportData().   Error code: %s.  Error: ', code, msg);
    });

    return d.promise;

};

Может кто-нибудь, пожалуйста, помогите мне, является ли процесс, которому я следовал, является правильным.

Ответы [ 3 ]

1 голос
/ 01 июня 2019

То, что вы пытались сделать, могло бы быть выполнено, но лучше всего это исправить, сравнив обещание, возвращаемое $q.all(), с отклоняемым Отложенным (т. Е. Отложенным, из которого сохраняется ссылка на метод отклонения), таким образом избегая отложенный анти-шаблон .

self.getDetailReportData = function(postData, functionName) {
    var metricDataType = ......; // ???
    var d = $q.defer();

    // cancel previous
    if(self.cancelDetailReport) {
        self.cancelDetailReport(new Error('previous getDetailReportData() cancelled'));
    }
    // keep a reference to the deferred's reject method for next time round.
    self.cancelDetailReport = d.reject;

    var promises = {
        'detailReport': metricDataType,
        'recommendedMetrics': DataSvc.getData(_logPrefix + functionName, recommendedMetricUrl),
        'metricInfo': DataSvc.getData(_logPrefix + functionName, metricInfoUrl)
    };

    // Race aggregated `promises` against `d.promise`, thus providing the required cancellation effect.
    return $q.race([$q.all(promises), d.promise])
    .then(function(response) {
        // arrive here only if all promises resolve and d.reject() has not been called.
        $log.debug(_logPrefix + 'getDetailReportData(). Called from %s. $q.all Response (raw): ', functionName, response);
        if (response && !_.isEmpty(_.get(response, 'largeCard.chartData.dataValues.rows')) && response.overlayEnabled) {
            return self.getMetricOverLay(pdata, functionName)
            .then(function(overlayData) {
                response.largeCard.chartData.overlay = overlayData;
                return response;
            });
        } else {
            return response;
        }
    })
    .catch(function(msg, code) { // signature?
        // all error cases including cancellation end up here.
        var message = _logPrefix + `getDetailReportData().   Error: (${code}): ${msg}`; // or similar
        $log.error(message);
        throw new Error(message); // see https://stackoverflow.com/a/42250798/3478010
    });
};

Примечания:

  1. $q.race() прозрачен для любого обещания, которое выигрывает гонку, и непрозрачен дляДругой.Таким образом, если d будет отклонено до того, как обещание, возвращенное $q.all(), выполнится, тогда d победит;Обработка response не произойдет, и отклонение d приведет к предложению .catch().В качестве альтернативы, если обещание, возвращаемое $q.all(promises), выигрывает, тогда поток будет следовать по пути успеха этого обещания (т.е. обработка response) или, возможно, по пути ошибки (который перейдет к предложению .catch()).

  2. Не слишком уверен насчет подписи обратного вызова .catch().Обычно вы ожидаете, что он примет один error аргумент.

0 голосов
/ 31 мая 2019

Просто скройте модал в тот момент, когда вы хотите его закрыть.

0 голосов
/ 31 мая 2019

Назначить уже созданный отложенный. Попробуйте изменить эту строку:

self.deferReturn = $q.defer();

self.deferReturn = d;

...