重定向到另一个页面可防止函数返回其值

时间:2018-07-18 08:01:18

标签: javascript angularjs redirect asynchronous

我有一个登录页面,如果用户登录,我想将用户重定向到另一个HTML页面,在该页面中,我将列出从服务器获得的用户任务。

问题是:

即使我编写的功能可以正常工作,并且当我使用重定向代码$window.location.href = '../Kullanici/userPanel.html时,后端API仍返回我想要的值(我可以在控制台上看到值的详细信息),该页面在登录后立即重定向,由于某种原因,重定向后不能使用函数返回的值。不仅如此,我再也看不到控制台日志中返回的值的详细信息。

这是我的代码:

控制器:

app.controller('myCtrl', ['$scope', '$http', '$window','$mdToast', 'userTaskList',
    function ($scope, $http, $window, $mdToast, userTaskList) {
        $scope.siteLogin = function () {

            var userName = $scope.panel.loginUserName;
            var password = $scope.panel.loginPassword;
            var loginMember = { //JSON data from login form
                K_ADI: $scope.panel.loginUserName,
                PAROLA: $scope.panel.loginPassword
            };
            $http({
                method: 'POST',
                url: 'http://localhost:5169/api/Kullanicilar/KullaniciDogrula',
                headers: {
                    'Content-Type': 'application/json'
                },
                data: loginMember

            }).then(function successCallback(response) {

                console.log("message sent", response);
                $scope.data = response.data.error.data;
                if ($scope.data === true) {//if username and password is correct

                    console.log("User exists");
                    userTaskList.showActiveTasks(userName)
                        .then(function (activeTaskResponse) {
                            var activeTasks = activeTaskResponse;
                            console.log("Active tasks (controller): ", activeTaskResponse);

                            userTaskList.showFinishedTasks(userName)
                                .then(function (finishedTaskResponse) {
                                    var finishedTasks = finishedTaskResponse;
                                    console.log("Finished tasks(controller): ", finishedTaskResponse);
                                    $scope.getMessage();
                                    $window.location.href = '../Kullanici/userPanel.html';
                                }, function (err) {
                                    console.log(err);
                                });

                        }, function (err) {
                            console.log(err);
                        });

                }

            }, function errorCallback(response) {
                console.log("Couldn't send", response);
            });
        }

那是什么导致此问题,我该如何解决?

编辑:我嵌套了 .then 部件,但它无法正常工作,并发出This value was just evaluated now警告。因此我无法在重定向的HTML页面上使用数据。

我还删除了工厂,因为这会使代码看起来非常凌乱,并且可能不是问题的根源。

2 个答案:

答案 0 :(得分:6)

我会将您的两个函数嵌套在第一个promise中,然后在完成所有重定向后将其重定向。像

app.controller('myCtrl', ['$scope', '$http', '$window','$mdToast', 'userTaskList',
  function ($scope, $http, $window, $mdToast, userTaskList) {
    $scope.siteLogin = function () {

        var userName = $scope.panel.loginUserName;
        var password = $scope.panel.loginPassword;
        var loginMember = { //JSON data from login form
            K_ADI: $scope.panel.loginUserName,
            PAROLA: $scope.panel.loginPassword
        };

        $http({
            method: 'POST',
            url: 'http://localhost:5169/api/Kullanicilar/KullaniciDogrula',
            headers: {
                'Content-Type': 'application/json'
            },
            data: loginMember

        }).then(function successCallback(response) {

            console.log("message sent", response);
            $scope.data = response.data.error.data;
            if ($scope.data === true) {//if username and password is correct

                console.log("User exists");
                userTaskList.showActiveTasks(userName)
                    .then(function (res) {
                        var activeTasks = res;
                        console.log("Active tasks (controller): ", res);

                        userTaskList.showFinishedTasks(userName)
                        .then(function (res) {
                            var finishedTasks = res;
                            console.log("Finished tasks(controller): ", res);
                            $scope.getMessage(); 
                            $window.location.href = '../Kullanici/userPanel.html';
                        }, function (err) {
                            console.log(err);
                        });

                    }, function (err) {
                        console.log(err);
                    });

            } else { //if username or password is wrong
                $mdToast.show(
                    $mdToast.simple()
                        .textContent('Username or Password is wrong')
                        .position('right')
                        .hideDelay(3000)
                            );      
            } 
        }, function errorCallback(response) {
            console.log("Couldn't send", response);
        });          
     }
   }
]);

答案 1 :(得分:6)

  

哦,我将ngRoute注入了我的AngularJS模块,但尚未使用它。

使用$window.location.href会杀死该应用程序并加载其他页面,从而丢失$rootScope$scope和所有服务数据。

重构您的代码以使用路由器并将数据存储在服务中

$routeProvider
 .when('/userPanel' , {
     templateUrl: 'partials/userPanel.html',
     controller: panelController
})
 panelService.set(data);
 $location.path("/userPanel.html");     

或使用localStorage存储数据:

 localStorage.setItem('panelData', JSON.stringify(data));
 $window.location.href = '../Kullanici/userPanel.html';

存储在服务中的数据将在路由更改后保留下来(这会破坏$ scope)。存储在localStorage中的数据将在页面更改后仍然有效(这会破坏应用程序)。


代码可以简化

这将解决让页面在更改路由之前等待数据的问题。

由于getMessages函数发出HTTP请求,因此需要对其进行修改以返回承诺:

$scope.getMessages = getMessages;
function getMessages() {
    return $http({
        method: 'GET',
        url: 'http://localhost:5169/api/chat/chatCek'
    }).then(function successCallback(res) {
        console.log("Mesajlar", res);
        $scope.messages = res.data.error.data;
        return res.data.error.data;
    }, function errorCallback(res) {
        console.log("Hata", res);
        throw res;
    });
}

然后将路由更改延迟到getMessages数据从服务器返回到getMessages承诺的链之后:

$http({
    method: 'POST',
    url: 'http://localhost:5169/api/Kullanicilar/KullaniciDogrula',
    data: loginMember
}).
  then(function successCallback(response) {
    console.log("message sent", response);
    $scope.data = response.data.error.data;
    if ($scope.data !== true) { throw "user error" };
    //username and password is correct
    console.log("User exists");
    return userTaskList.showActiveTasks(userName);
}).
  then(function (activeTaskResponse) {
    var activeTasks = activeTaskResponse;
    console.log("Active tasks (controller): ", activeTaskResponse);
    return userTaskList.showFinishedTasks(userName)
}).
  then(function (finishedTaskResponse) {
    var finishedTasks = finishedTaskResponse;
    console.log("Finished tasks(controller): ", finishedTaskResponse);
    //CHAIN from getMessages promise
    return $scope.getMessages();
}).
  then(function(data) {
    console.log(data);
    //SAVE data before changing route
    panelService.set(data);
    $location.path( "/userPanel" );
    //OR STORE data before changing app
    //localStorage.setItem('panelData', JSON.stringify(data));             
    //$window.location.href = '../Kullanici/userPanel.html';
}).
  catch(function (response) {
    console.log("Couldn't send", response);
    throw response;
});