AngularJS指令中的回调问题

callback issue in angularjs directive

本文关键字:回调 问题 指令 AngularJS      更新时间:2023-09-26

我在调用服务函数时遇到回调问题

这是我在registrationService中定义的函数

function hasUserAccessToLevel(incentiveLevel, callback, showRegistrationView) {
            var url = "...";
            httpWrapperService.get(url)
                .then(
                function success(data) {
                    var hasAccess = incentiveLevel <= data.Level;
                    callback(hasAccess);
                    if (showRegistrationView && hasAccess == false) {
                        showRegistrationViewForLevel(incentiveLevel);
                    }
                },
                function error(errorObject) {
                    alert("User has not access'r'nTODO : show popup for registration/login");
                }
            );
            return false;
        }

在我的指令中,我将此功能用作

function checkAuthentication() {
                registrationService.hasUserAccessToLevel(2, function (hasAccess) {
                    if (hasAccess == false){
                        return false;
                    }
                    else{
                        return true;
                    }
                });
            }


function loadDocuments() {
                var target=checkAuthentication()
                if(target)
                {
                  //load both private and public
                }
                else
                {
                  // load only public
                }
            }

现在我面临的问题是,我有另一个函数loaDocuments,当用户登录时,它应该进入if(target)块,但是当我调试函数时,它说目标未定义,因此控件将转到其他部分,这是错误的。我知道有一些回调问题,但不知道如何纠正它。

任何帮助都是可以接受的。谢谢

您应使用$q服务。 checkAuthentication()返回undefined hasUserAccessToLevel()因为它是异步的,并且在调用时没有返回值。解决方案是返回promise对象。

你可以这样写代码:

function checkAuthentication() {
    var defer = $q.defer();
    registrationService.hasUserAccessToLevel(2, function (hasAccess) {
        defer.resolve(hasAccess);
    }, function () {
        defer.reject();
    });
    return defer.promise;
}
function loadDocuments() {
    checkAuthentication().then(function (target) {
        if (target) {
            //load both private and public
        }
        else {
           // load only public
        }
    });
}