angularjs指令中的回调问题

时间:2016-01-28 12:04:11

标签: javascript angularjs callback

我在调用服务功能时面临回调问题

这是我在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)块,但是当我调试函数时,它表示目标是未定义的因此控制权将转向其他部分,这是错误的。我知道有一些回调问题,但不知道如何纠正它。

任何帮助都是适合的。 感谢

1 个答案:

答案 0 :(得分:0)

您应使用$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
        }
    });
}