AngularJS - 同步$ http.post请求

时间:2016-05-26 07:34:52

标签: javascript angularjs post

我需要在我的代码中执行两个$ http.post请求。第一个检索第二个用于查找SQL数据库的密钥。

目前,它们是这样嵌套的:

$http.post(...)
.success(function(data, status) {
    //Do something
    $http.post(...)
    .success(function(data, status) {
        //Do something else
    }
}

我非常怀疑这是这样做的正确方法。我不能让第二个请求等待第一个请求,最终得到类似的东西:

$http.post(...)
.success(function(data, status) {
    //Do something
}

$http.post(...)
.success(function(data, status) {
    //Do something else
}

4 个答案:

答案 0 :(得分:3)

使用promise API的一个很大的好处就是可以停止嵌套回调,这样可以提供更易读/可维护的代码。

$http.post(...)
.then(function(result) {
    // do something
    return $http.post(...);
})
.then(function(result) {
    // do something with the second result
});

您还应该注意,处理承诺的成功/错误方式已被弃用

  

$ http遗留承诺方法成功与错误已被弃用。请改用标准方法。如果$ httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将抛出$ http / legacy错误。

https://docs.angularjs.org/api/ng/service/$http

答案 1 :(得分:0)

第一个是最安全的方式,因为调用是异步的,你无法保证执行的顺序。作为替代方案,您可以选择在第一个呼叫的成功块中设置一个标志,根据该标志,您可以启动第二个呼叫时间。

答案 2 :(得分:0)

使用angular是你能做到的唯一方法,角度中没有同步的ajax。这种方法最好用不同的方法将它们分开。

答案 3 :(得分:0)

$http是一个异步api。但是,您可以使用$q服务使它们像同步调用一样。

这是一个展示它的例子。

您的第一个功能

$scope.Func1= function () {
        var url= "http://stackoverflow.com";
        var query = "";
        var deferred = $q.defer();
        $http({
            url: url,
            method: "POST",
            data: query,
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
        })
        .then(function (response) {
            deferred.resolve(response.data);
        },
        function (response) {
            deferred.reject('failed');
        });
        return deferred.promise;
    };

您的第二个功能

$scope.Func2= function (tmp) {
            var url= "http://stackoverflow.com";
            var query = "id="+tmp;
            $http({
                url: url,
                method: "POST",
                data: query,
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
            })
            .then(function (response) {
                // on success
            },
            function (response) {
                // on error
            });
        };

如何打电话给他们?

var promise = $scope.Func1();
    promise.then(function (resolve) {
        // this is called for deferred.resolve
        $scope.Func1(resolve); // calling second function
    },
    function (reject) {
        // this is called for deferred.reject
    });