Как вернуть обещание от сервиса AngularJS, используя $ q.all - PullRequest
0 голосов
/ 16 февраля 2019

Цель состоит в том, чтобы вернуть логическое значение, определяющее, можно ли разместить вакансию на основе заработанного персонала.Существуют разные части, которые приходят из трех разных таблиц SQL.Вместо того чтобы делать SQL-запрос, который возвращает все из них в одном результате, я пытаюсь понять, как использовать функцию $ q.all.Проблема в том, что я не получаю обещание от службы.Ошибка: TypeError: Невозможно прочитать свойство 'then' с неопределенным значением

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

Вот код в моем сервисе:

    function isMDOLevelAllowed(mdoLevel, finance) {
        this.crData = "";
        this.pData = "";
        var mdoLevelToMatch = "", mdoMatrix = "", mdoOnRollsTotal = 0, mdoAuthTotal = 0;
        var mdoVarianceTotal = 0, mdoPending = 0, mdoPendingThisLevel = 0;

        return $q.all([
            getCRO36ByFinance(finance),
            epEarnedMDOSDOResource(finance),
            getPendingByFinance(finance)
        ]).then(function (data) {
            var crData = data[0];
            var eData = data[1];
            var pData = data[2];

            var mdoData = crData.filter(function (m) { return m.jobType === "MDO"; });
            mdoLevelToMatch = mdoData.filter(function (m) { return m.payGrade === mdoLevel; })[0];
            mdoVarianceTotal = mdoData.reduce(function (a, b) { return a + b.variance; }, 0);
            mdoMatrix = mdoData.map(function (m) { return { payGrade: m.payGrade, authorized: m.totalAuthorized }; });
            mdoPending = pData.mdoTotalCount;
            mdoPendingThisLevel = eval("pData.mdO" + mdoLevelToMatch.payGrade + "Count");

            // Check if over Total Authorized
            if (mdoVarianceTotal + mdoPending < 0) {
                // Check if over Paylevel Authorized
                if (mdoLevelToMatch.variance + mdoPendingThisLevel < 0) {
                    return $q.resolve();
                }
                else {
                    return $q.reject();
                }
            }
            else {
                return $q.reject();
            }

        }).$promise;

    }

    var service = {
        getEarnedByFinance: getEarnedByFinance,
        getCRO36ByFinance: getCRO36ByFinance,
        getPendingByFinance: getPendingByFinance,
        isMDOLevelAllowed: isMDOLevelAllowed,
        isSDOAllowed: isSDOAllowed
    };
    return service;

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Спасибо за вашу помощь.Я получил это на работу.Я изменил $ q.resolve, $ q.reject на возвращаемое значение true или false и в конце удалил обещание $.

function isMDOLevelAllowed(mdoLevel, finance) {
            this.crData = "";
            this.pData = "";
            var mdoLevelToMatch = "", mdoMatrix = "", mdoOnRollsTotal = 0, mdoAuthTotal = 0;
            var mdoVarianceTotal = 0, mdoPending = 0, mdoPendingThisLevel = 0;

            return $q.all([
                getCRO36ByFinance(finance),
                epEarnedMDOSDOResource(finance),
                getPendingByFinance(finance)
            ]).then(function (data) {
                var crData = data[0];
                var eData = data[1];
                var pData = data[2];

                var mdoData = crData.filter(function (m) { return m.jobType === "MDO"; });
                mdoLevelToMatch = mdoData.filter(function (m) { return m.payGrade === mdoLevel; })[0];
                //mdoOnRollsTotal = mdoData.reduce(function (a, b) { return a + b.totalOnRolls; }, 0);
                //mdoAuthTotal = mdoData.reduce(function (a, b) { return a + b.totalAuthorized; }, 0);
                mdoVarianceTotal = mdoData.reduce(function (a, b) { return a + b.variance; }, 0);
                mdoMatrix = mdoData.map(function (m) { return { payGrade: m.payGrade, authorized: m.totalAuthorized }; });
                mdoPending = pData.mdoTotalCount;
                mdoPendingThisLevel = eval("pData.mdO" + mdoLevelToMatch.payGrade + "Count");

                // Check if over Total Authorized
                if (mdoVarianceTotal + mdoPending < 0) {
                    // Check if over Paylevel Authorized
                    if (mdoLevelToMatch.variance + mdoPendingThisLevel < 0) {
                        return true;
                    }
                    else {
                        return false;
                    }
                }
                else {
                    return false;
                }

            });
        }
0 голосов
/ 16 февраля 2019

Как насчет попытки:

function isMDOLevelAllowed(mdoLevel, finance) {
    var defer = $q.defer();
    this.crData = "";
    this.pData = "";
    var mdoLevelToMatch = "", mdoMatrix = "", mdoOnRollsTotal = 0, mdoAuthTotal = 0;
    var mdoVarianceTotal = 0, mdoPending = 0, mdoPendingThisLevel = 0;

    $q.all([
        getCRO36ByFinance(finance),
        epEarnedMDOSDOResource(finance),
        getPendingByFinance(finance)
    ]).then(function (data) {
        var crData = data[0];
        var eData = data[1];
        var pData = data[2];

        var mdoData = crData.filter(function (m) { return m.jobType === "MDO"; });
        mdoLevelToMatch = mdoData.filter(function (m) { return m.payGrade === mdoLevel; })[0];
        mdoVarianceTotal = mdoData.reduce(function (a, b) { return a + b.variance; }, 0);
        mdoMatrix = mdoData.map(function (m) { return { payGrade: m.payGrade, authorized: m.totalAuthorized }; });
        mdoPending = pData.mdoTotalCount;
        mdoPendingThisLevel = eval("pData.mdO" + mdoLevelToMatch.payGrade + "Count");

        // Check if over Total Authorized
        if (mdoVarianceTotal + mdoPending < 0) {
            // Check if over Paylevel Authorized
            if (mdoLevelToMatch.variance + mdoPendingThisLevel < 0) {
                defer.resolve();
            }
            else {
                defer.reject();
            }
        }
        else {
            defer.reject();
        }

    });
   return defer.promise;
}

Обратите внимание на то, как я определил var defer = $q.defer();, а затем вернул defer.promise только один раз.Вам не нужно возвращать resolve и reject

...