Javascript AngularJS-同步$http.post请求
我需要在代码中执行两个$http.post请求。第一个检索键,第二个检索键用于查找SQL数据库 目前,它们是这样嵌套的: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(...)
.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
界面-