我偶然发现了一段不是100%安全的Ajax代码,因为它混合了异步/同步类型的代码…所以基本上在下面的代码中我有一个jQuery.each,其中每个元素都获取有关元素的信息并启动Ajax收到每个请求:
$(search).each(function() {
$.ajax({
url: 'save.x3?id='+$(this).attr("id")+'value='$(this).data("value");
success: function(o){
//Update UI
},
error: function(o){
//Update UI
}
});
});
//code to do after saving...
因此,显然,“保存后要执行的代码…”通常在所有请求完成之前执行。在理想情况下,我想让服务器端代码一次处理所有这些代码,并保存成功回调后将//代码移到要执行的代码中,但是假设这不可能,我将代码更改为如下代码:确保所有请求都返回,然后再继续执行,而我仍然不喜欢:
var recs = [];
$(search).each(function() {
recs[recs.length] = 'save.x3?id='+$(this).attr("id")+'value='$(this).data("value");
});
var counter = 0;
function saveRecords(){
$.ajax({
url: recs[counter],
success: function(o){
//Update progress
if (counter<recs.length){
counter++;
saveRecords();
}else{
doneSavingRecords();
}
},
error: function(o){
//Update progress
doneSavingRecords(o.status);
}
});
}
function doneSavingRecords(text){
//code to do after saving...
}
if (recs.length>0){
saveRecords(); //will recursively callback itself until a failed request or until all records were saved
}else{
doneSavingRecords();
}
因此,我正在寻找向一系列异步调用中添加一些同步功能的“最佳”方法?
谢谢!!
更好的答案 :
function saveRecords(callback, errorCallback){
$('<div></div>').ajaxStop(function(){
$(this).remove(); // Keep future AJAX events from effecting this
callback();
}).ajaxError(function(e, xhr, options, err){
errorCallback(e, xhr, options, err);
});
$(search).each(function() {
$.get('save.x3', { id: $(this).attr("id"), value: $(this).data("value") });
});
}
可以这样使用:
saveRecords(function(){
// Complete will fire after all requests have completed with a success or error
}, function(e, xhr, options, err){
// Error will fire for every error
});
原始答案 :如果它们需要按一定顺序排列,或者页面上有其他常规AJAX事件会影响的使用ajaxStop
,则这样做会很好,但这会比较慢:
function saveRecords(callback){
var recs = $(search).map(function(i, obj) {
return { id: $(obj).attr("id"), value: $(obj).data("value") };
});
var save = function(){
if(!recs.length) return callback();
$.ajax({
url: 'save.x3',
data: recs.shift(), // shift removes/returns the first item in an array
success: function(o){
save();
},
error: function(o){
//Update progress
callback(o.status);
}
});
}
save();
}
然后您可以这样称呼它:
saveRecords(function(error){
// This function will run on error or after all
// commands have run
});
问题内容: 如何在异步forEach循环后添加回调函数? 这里是一些更好的上下文: 控制器: 服务: 问题答案: 正如安德鲁所说,使用和延迟对象应该可以使您实现目标。 您想使用 这将确保您的所有promise对象都已解析,然后您可以回叫 jsfiddle上的示例 可以,但不能通话 使用延迟对象,您可以访问Promise,在此可以一起更改连续的调用。解析延迟的对象时,它将执行foreach,然后执行
问题内容: 我在数组上进行映射,对于新对象的返回值之一,我需要进行异步调用。 该功能的实现将类似于 我不清楚做到这一点的最佳方法是什么…承诺?嵌套的回调?在ES6或ES7中使用某些东西,然后与Babel进行转换? 目前实现此目的的最佳方法是什么? 谢谢! 问题答案: 一种方法是(ES6)。 该答案将在Node 4.0+中起作用。较旧的版本将需要Promise polyfill或库。我还使用了ES6
问题内容: 如标题所示。我该怎么做呢? 我想在forEach循环遍历每个元素并完成一些异步处理后调用。 有可能使它像这样工作吗?当forEach的第二个参数是一个回调函数,该函数一旦经过所有迭代便会运行? 预期产量: 问题答案: 不能提供这种效果(如果可以的话),但是有几种方法可以实现您想要的效果: 使用一个简单的计数器 (由于@vanuan等),这种方法可确保在调用“完成”回调之前处理所有项目。
我正在使用的应用程序将按以下顺序使用2个REST web服务: 1) 计数记录-了解特定时间范围内的记录数。 2)获取记录——一旦我们有了记录的数量,我们就需要调用这项服务。但是这项服务有一个门槛来一次性获取10K记录。假设第一个服务在特定的时间间隔内告诉我,它有100K的记录,那么我需要以分页方式调用第二个网络服务10次,考虑到它的阈值是一次10K的。 因此,如果我将进行10次同步调用,我的应用
我有一个无状态bean,它使用其他bean的异步方法插入一些数据(本地注入)。此数据插入需要一段时间,所以我不等待完成此操作。在此数据插入之后,我将调用相同bean的另一个方法。当我将调试点放置到方法时,server大约要等待90秒才能到达此点。可能是Jboss为异步方法等待事务完成。我不知道是怎么回事。. 我已经使用JStack创建了一个线程转储。实际上,我在Jboss As 6中没有这个问题。