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

如何使用$q.all从AngularJS服务返回承诺,angularjs,q,Angularjs,Q,目标是返回一个布尔值,定义是否可以基于挣来的人员编制发布作业。 有来自三个不同sql表的不同部分。我试图理解如何使用$q.all函数,而不是在一个结果中返回所有的sql查询。问题是我没有从服务中得到承诺。错误为:TypeError:无法读取未定义的属性“then” 有一些关于这个主题的文章,但我发现大多数都是旧的,仍然提到使用defer。我试过其他人的建议,但没有一个有效。他们提到$q.all需要一个返回值,并且返回$q.resolve和$q.reject作为返回值 以下是我服务中的代码:

目标是返回一个布尔值,定义是否可以基于挣来的人员编制发布作业。 有来自三个不同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;
函数是允许的(mdoLevel,财务){
this.crData=“”;
this.pData=“”;
var mdoLevelToMatch=“”,mdoMatrix=“”,mdoOnRollsTotal=0,mdoAuthTotal=0;
var MDOvoridanceTotal=0,mdoPending=0,mdoPendingThisLevel=0;
返回$q.all([
getCRO36ByFinance(财务),
Eperneedmdosdoresource(财务),
getPendingByFinance(财务)
]).then(功能(数据){
var crData=数据[0];
var eData=数据[1];
var pData=数据[2];
var mdoData=crData.filter(函数(m){return m.jobType==“MDO”;});
mdoLevelToMatch=mdoData.filter(函数(m){return m.payGrade==mdoLevel;})[0];
mdOvoridanceTotal=mdoData.reduce(函数(a,b){返回a+b.variance;},0);
mdoMatrix=mdoData.map(函数(m){return{payGrade:m.payGrade,authorized:m.totalAuthorized};});
mdoPending=pData.mdotototatalcount;
mdoPendingThisLevel=eval(“pData.mdO”+mdoLevelToMatch.payGrade+“Count”);
//检查是否超过授权总数
如果(MDOxOnceTotal+mdoPending<0){
//检查是否超过授权的薪资水平
如果(mdoLevelToMatch.variance+mdoPendingThisLevel<0){
返回$q.resolve();
}
否则{
返回$q.reject();
}
}
否则{
返回$q.reject();
}
}).$承诺;
}
var服务={
getEarnedByFinance:getEarnedByFinance,
getCRO36ByFinance:getCRO36ByFinance,
getPendingByFinance:getPendingByFinance,
isMDOLevelAllowed:isMDOLevelAllowed,
isSDOAllowed:isSDOAllowed
};
回程服务;
试一试怎么样:

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;
}
函数是允许的(mdoLevel,财务){
var defer=$q.defer();
this.crData=“”;
this.pData=“”;
var mdoLevelToMatch=“”,mdoMatrix=“”,mdoOnRollsTotal=0,mdoAuthTotal=0;
var MDOvoridanceTotal=0,mdoPending=0,mdoPendingThisLevel=0;
$q.all([
getCRO36ByFinance(财务),
Eperneedmdosdoresource(财务),
getPendingByFinance(财务)
]).then(功能(数据){
var crData=数据[0];
var eData=数据[1];
var pData=数据[2];
var mdoData=crData.filter(函数(m){return m.jobType==“MDO”;});
mdoLevelToMatch=mdoData.filter(函数(m){return m.payGrade==mdoLevel;})[0];
mdOvoridanceTotal=mdoData.reduce(函数(a,b){返回a+b.variance;},0);
mdoMatrix=mdoData.map(函数(m){return{payGrade:m.payGrade,authorized:m.totalAuthorized};});
mdoPending=pData.mdotototatalcount;
mdoPendingThisLevel=eval(“pData.mdO”+mdoLevelToMatch.payGrade+“Count”);
//检查是否超过授权总数
如果(MDOxOnceTotal+mdoPending<0){
//检查是否超过授权的薪资水平
如果(mdoLevelToMatch.variance+mdoPendingThisLevel<0){
defer.resolve();
}
否则{
defer.reject();
}
}
否则{
defer.reject();
}
});
回报、承诺;
}

请注意我是如何定义
var defer=$q.defer()的
然后返回
defer.promise
仅一次。您不需要返回
解决
拒绝

谢谢您的帮助。我让它工作了。我将$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;
                }

            });
        }
函数是允许的(mdoLevel,财务){
this.crData=“”;
this.pData=“”;
var mdoLevelToMatch=“”,mdoMatrix=“”,mdoOnRollsTotal=0,mdoAuthTotal=0;
var MDOvoridanceTotal=0,mdoPending=0,mdoPendingThisLevel=0;
返回$q.all([
getCRO36ByFinance(财务),
Eperneedmdosdoresource(财务),
getPendingByFinance(财务)
]).then(功能(数据){
var crData=数据[0];
var eData=数据[1];
var pData=数据[2];
var mdoData=crData.filter(函数(m){return m.jobType==“MDO”;});
mdoLevelToMatch=mdoData.filter(函数(m){return m.payGrade==mdoLevel;})[0];
//mdoOnRollsTotal=mdoData.reduce(函数(a,b){返回a+b.totalOnRolls;},0);
//mdoAuthTotal=mdoData.reduce(函数(a,b){返回a+b.totalAuthorized;},0);
mdOvoridanceTotal=mdoData.reduce(函数(a,b){返回a+b.variance;},0);
mdoMatrix=mdoData.map(函数(m){return{payGrade:m.payGrade,authorized:m.totalAuthorized};});
mdoPending=pData.mdotototatalcount;
mdoPendingThisLevel=eval(“pData.mdO”+mdoLevelToMatch.payGrade+“Count”);
//检查是否超过授权总数
如果(MDOxOnceTotal+mdoPending<0){