Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS-同步$http.post请求_Javascript_Angularjs_Post - Fatal编程技术网

Javascript AngularJS-同步$http.post请求

Javascript AngularJS-同步$http.post请求,javascript,angularjs,post,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请求。第一个检索键,第二个检索键用于查找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
}

第一种是最安全的方法,因为调用是异步的,并且不能保证执行顺序。或者,您可以选择在第一次调用的成功块中设置一个标志,根据该标志,您可以启动第二次post调用。

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

使用angular是唯一的方法,angular中没有同步ajax。另外,这种方法最好用不同的方法将它们分开。

使用angular是唯一可以做到这一点的方法,angular中没有同步ajax。另外,这种方法最好用不同的方法将它们分开。

使用promise API操作系统的最大优点之一是,您可以停止嵌套回调,这允许编写更可读/可维护的代码

$http.post(...)
.then(function(result) {
    // do something
    return $http.post(...);
})
.then(function(result) {
    // do something with the second result
});
您还应该注意到,处理承诺的成功/错误方式已被弃用

$http legacy promise方法success和error已被弃用。改用标准then方法。如果$httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将抛出$http/legacy错误


使用promise API操作系统的最大优点之一是,您可以停止嵌套回调,这允许编写更可读/可维护的代码

$http.post(...)
.then(function(result) {
    // do something
    return $http.post(...);
})
.then(function(result) {
    // do something with the second result
});
您还应该注意到,处理承诺的成功/错误方式已被弃用

$http legacy promise方法success和error已被弃用。改用标准then方法。如果$httpProvider.useLegacyPromiseExtensions设置为false,则这些方法将抛出$http/legacy错误


$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
            });
        };
您的第二项功能

$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
    });

$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
            });
        };
您的第二项功能

$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
    });

在调用第二个请求之前添加if条件,成功后第一个请求调用第二个请求并使用第一个请求响应数据wellcome to callback hell:)第一个代码段是正确的。EcmaScript 6中有
生成器
,EcmaScript 7中有
异步函数
,它们可以暂停执行,因此您可以以同步方式编写异步任务,但在ES5中,最明显的“最佳”方式是回调。在调用第二个请求之前添加if条件,成功后,第一个请求调用第二个请求并使用第一个请求响应数据wellcome to callback hell:)第一个代码段是正确的。EcmaScript 6中有
生成器
,EcmaScript 7中有
异步函数
,它们可以暂停执行,因此您可以以同步方式编写异步任务,但在ES5中,最明显的“最佳”方式是回调,因为$http一调用服务器就将其执行控制权传递给下一个可执行语句。在服务器响应到达之前,它不会阻止执行。在这里,flag没有帮助,因为$http在调用服务器时会将其执行控制权传递给下一个可执行语句。在服务器响应到达之前,它不会阻止执行。HTML5 rocks上有一个很好的教程,用于处理角度文档,也用于检查角度文档,因为HTML5 rocks上有一个很好的教程,用于在
Func1
中处理角度文档,为什么不返回
$http
调用?这里有一篇很好的文章()解释您的问题。这篇文章不再相关了
$http
现在使用
$q
接口-在
Func1
中,为什么不直接返回
$http
调用生成的承诺呢?这里有一篇很好的文章()解释你的问题。那篇文章不再相关
$http
现在使用
$q
界面-