Javascript 两个函数的 callback()
Javascript callback() for two functions
我有两个关于 JavaScript 回调的问题。
第一:for
是否异步循环 运行?即在函数中:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
//angularjs Post request
$http.post("http://www....", item[i]);
}
callback();
}
callback()
会等到循环结束吗?
第二:如何等待两个函数的回调?
我有另一个函数 deleteData(items, callback)
,我想 运行 与 postData()
异步。两者完成后我想做一些 "refresh".
目前我正在使用:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
//angularjs Post request
$http.post("http://www....", item[i]);
}
callback();
}
function deleteData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
//angularjs delete request
$http.delete("http://www....", item[i].id);
}
callback();
}
function refresh()
{
$http.get("www....").success....
}
function doit(post, delete)
{
postData(post, function(){
deleteData(delete, function(){
refresh();
})
});
}
是否可以使 postData
和 deleteData
运行 异步并且当两者都完成时 运行 refresh
?
----- 编辑 -----
为了确保在循环完成后发送回调,我使用这样的代码:
function postData(items, callback)
{
if(items.length == 0)
callback();
for(var i=0 ; i < items.length ; i++)
{
//angularjs Post request
$http.post("http://www....", item[i]);
if(i == items.length-1)
callback();
}
callback();
}
但它看起来很难看...我希望有一个更清洁的解决方案...
回复 Ivan,Angular 也有 http 请求的回调,我不需要使用 $ajax 并且我不想为每个 http 请求回调
第一:不会,不会等
第二:使用$.ajax:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
$.ajax({
url: "http://www....",
...........
}).done(function() {
callback();
});
}
}
或者香草 JS:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
var r = new XMLHttpRequest();
r.open("POST", "http://www....", true);
r.onreadystatechange = function () {
if (r.readyState != 4 || r.status != 200) return;
callback();
};
}
}
是的,使用 $q promise 库,您可以做到这一点。
如果您正在使用 angular,$q 已经在您的项目中,只需将其包含在您正在使用的 service/controller 中即可。
$q.all 完全符合您的要求。
外观示例:
var promises = [];
// loop x times
for(var i = 0; i < items.length; i ++){
var promise = $http.post("http://www....", item[i]);
promises.push(promise);
}
// Refresh will be called when all posts are completed.
$q.all(promises).then(refresh);
我有两个关于 JavaScript 回调的问题。
第一:for
是否异步循环 运行?即在函数中:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
//angularjs Post request
$http.post("http://www....", item[i]);
}
callback();
}
callback()
会等到循环结束吗?
第二:如何等待两个函数的回调?
我有另一个函数 deleteData(items, callback)
,我想 运行 与 postData()
异步。两者完成后我想做一些 "refresh".
目前我正在使用:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
//angularjs Post request
$http.post("http://www....", item[i]);
}
callback();
}
function deleteData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
//angularjs delete request
$http.delete("http://www....", item[i].id);
}
callback();
}
function refresh()
{
$http.get("www....").success....
}
function doit(post, delete)
{
postData(post, function(){
deleteData(delete, function(){
refresh();
})
});
}
是否可以使 postData
和 deleteData
运行 异步并且当两者都完成时 运行 refresh
?
----- 编辑 -----
为了确保在循环完成后发送回调,我使用这样的代码:
function postData(items, callback)
{
if(items.length == 0)
callback();
for(var i=0 ; i < items.length ; i++)
{
//angularjs Post request
$http.post("http://www....", item[i]);
if(i == items.length-1)
callback();
}
callback();
}
但它看起来很难看...我希望有一个更清洁的解决方案...
回复 Ivan,Angular 也有 http 请求的回调,我不需要使用 $ajax 并且我不想为每个 http 请求回调
第一:不会,不会等
第二:使用$.ajax:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
$.ajax({
url: "http://www....",
...........
}).done(function() {
callback();
});
}
}
或者香草 JS:
function postData(items, callback)
{
for(var i=0 ; i < items.length ; i++)
{
var r = new XMLHttpRequest();
r.open("POST", "http://www....", true);
r.onreadystatechange = function () {
if (r.readyState != 4 || r.status != 200) return;
callback();
};
}
}
是的,使用 $q promise 库,您可以做到这一点。 如果您正在使用 angular,$q 已经在您的项目中,只需将其包含在您正在使用的 service/controller 中即可。
$q.all 完全符合您的要求。
外观示例:
var promises = [];
// loop x times
for(var i = 0; i < items.length; i ++){
var promise = $http.post("http://www....", item[i]);
promises.push(promise);
}
// Refresh will be called when all posts are completed.
$q.all(promises).then(refresh);