gpt4 book ai didi

AngularJS - Controller 不等待条件语句中的服务返回值

转载 作者:行者123 更新时间:2023-12-04 23:24:26 24 4
gpt4 key购买 nike

如果登录用户尝试在应用程序中访问它,我目前正在尝试将登录用户从登录页面重定向。与登录页面关联的 Controller - Login_controller调用授权服务中的函数 - Authorisation_service.isLoggedIn() .如果此服务返回 true,则应将用户重定向到已登录的概览页面。

通过登录控制台,我可以看到在服务返回 true 之前,条件语句已经声明服务的返回值未定义。之后服务确实返回true,但为时已晚。

如何让 Controller 的条件语句等待服务的返回值?

Authorise_service.js

myApp.factory('Authorise', ['User', '$http', '$location', '$rootScope', function( User, $http, $location, $rootScope ) {
return {
isLoggedIn: function() {
if( ((sessionStorage.username && sessionStorage.authKey) && (sessionStorage.username !== "null" && sessionStorage.authKey !== "null")) || ((localStorage.username && localStorage.authKey) && (localStorage.username !== "null" && localStorage.authKey !== "null" )) ) {
if( sessionStorage.username ) {
var usernameLocal = sessionStorage.username;
var authKeyLocal = sessionStorage.authKey;
} else {
var usernameLocal = localStorage.username;
var authKeyLocal = localStorage.authKey;
}
//pass to server
var user = User.query({ usernameLocal: usernameLocal, authKeyLocal: authKeyLocal }, function(user) {
if( user.loginSuccess === 1 ) {
return true;
} else {
return false;
}
});
} else {
return false;
}
}
};
}]);

Login_controller.js
myApp.controller( 'Login_controller', function( Authorise, $scope, $location ) {
if( Authorise.isLoggedIn() === true ) {
console.log("Authorise.isLoggedIn() = true");
$location.path('/teach/overview');
}
});

最佳答案

Smk 是对的。您可能正试图依赖 的数据。服务器尚未返回 . “然而”是这里的关键问题,因为很可能您的数据是从服务器正确获取的,您只是试图在结果准备好之前引用结果!要检查这是否属实,只需添加 console.log(user)User.query(...)打回来。

Smk 为您指出了正确的方法 - 改用 PROMISE API。基本上,promise 是一个对象,当结果从服务器准备好时,您可以进一步使用它来执行某些操作。为了说明这一点:

function myFunc() {
var result = false;

// You are calling async request to the server, so the execution won't wait for the
// results. It will simply fire server request and proceed to next lines.
serverCall(function(srvResponse){

result = srvResponse.everythingIsGood; // This will be called after the whole method finishes!
});

return result; // This will MOST PROBABLY return 'false' all the times.
}

这样做的正确方法:
function theRealLogicYouWantToDo(result) {
if (result) {
// ...
} else {
// ...
}
}

serverCall(function(srvResponse) {
theRealLogicYouWantToDo(srvResposne.everythingIsGood);
});

This is nice tutorial关于 JQUERY 中的所有这些。它不仅用于服务器调用,还用于 JS 中的其他一些地方。好好学习一下。

关于AngularJS - Controller 不等待条件语句中的服务返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15287377/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com