【问题标题】:callback issue in angularjs directiveangularjs指令中的回调问题
【发布时间】:2016-01-28 12:04:11
【问题描述】:

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

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

任何帮助都是可取的。 谢谢

【问题讨论】:

  • checkAuthentication 方法未返回任何内容,因此返回值将始终为 undefined

标签: javascript angularjs callback


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2014-03-26
    相关资源
    最近更新 更多