我需要在我的代码中执行两个$ 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
}
答案 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错误。
答案 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
});