如何使用$ q.all从AngularJS服务中返回承诺

时间:2019-02-15 22:27:23

标签: angularjs q

目标是返回一个布尔值,该值定义是否可以根据获得的人员配置来发布工作。 来自三个不同的sql表的不同部分。我正在尝试了解如何使用$ q.all函数,而不是进行一次在一个结果中返回所有结果的sql查询。问题是我没有从服务中得到承诺。错误是: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 :(得分:0)

尝试如何:

[0-9]

记录一下我如何定义preg_replace('/w\d+-h\d+-p/', 's0', $imgurl); ,然后仅返回一次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

答案 1 :(得分:0)

感谢您的帮助。我知道了。我将$ q.resolve,$ q.reject更改为返回true或false,并在最后删除了$ promise。

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;
                }

            });
        }