$ http.post中的$ http.post,返回响应不会直接更新

时间:2016-07-04 02:59:05

标签: html angularjs

我有一个功能,它有 $ http.post 用于登录目的。如果成功,另一个 $ http.post 将调用从数据库中获取数据的php文件。问题是,当我尝试从 localStorage 加载数据时,它返回null。为什么会这样?

$scope.loginUser = function () 
{
    var data = 
    {
        username: $scope.loginInfo.username,
        password: $scope.loginInfo.password
    }
    $http.post("endpoints/login.php", data).success(function(response)
    {
        if(response==="ERROR")
        {
            //DONT DO ANYTHING
        }    
        else
        {
            localStorage.setItem("token", JSON.stringify(response));
            console.log("loginController: name is this "  + localStorage);
            fetchDataFunction(data);
            $state.go("application");


            //$state.go("application", result);
        }     
    }).error(function(error)
    {
        console.error(error);
    });

}

fetchDataFunction = function(data)
{
    $http.post("endpoints/fetchData.php", data).success(function(response)
    {
        localStorage.setItem("data", JSON.stringify(response));
    }).error(function(error)
    {
        console.error(error);
    });
}

1 个答案:

答案 0 :(得分:0)

您可以返回$http.post,它将返回一个承诺,然后您的所有代码都将以正确的顺序运行:

$scope.loginUser = function () {
    login($scope.loginInfo).then(function (response) {

        localStorage.setItem("token", JSON.stringify(response));
        console.log("loginController: name is this " + localStorage.getItem("token"));

        fetchDataFunction(data).then(function () {

            localStorage.setItem("data", JSON.stringify(response));
            console.log(localStorage.getItem("data"));
            $state.go("application");

        }).catch(function (error) {
            console.error(error);
        });

    }).catch(function (response) {

        console.error(error);

    });
};

var login = function (user) {
    return post("endpoints/login.php", user);
};

var fetchDataFunction = function (data) {
    return post("endpoints/fetchData.php", data);
};

var post = function (url, data) {

    var deferred = $q.defer;

    $http.post(url, data).then(function (response) {
        if (response === "ERROR") {
            deferred.reject(response);
        }
        else {
            deferred.resolve(response);
        }
    }).catch(function (error) {
        deferred.reject(error);
    });

    return deferred;
};

注意:

  • 您需要确保将$ q与$ http
  • 一起注入控制器
  • 在从全局对象中调用信息时,您应该使用localStorage.getItem()
  • 您应该使用then/catch代替success/error,因为这些现已折旧:https://docs.angularjs.org/api/ng/service/ $ http