Javascript 等待几个ajax调用完成,然后执行一些操作
我有这个:Javascript 等待几个ajax调用完成,然后执行一些操作,javascript,ajax,Javascript,Ajax,我有这个: $("#grid tbody tr").each(function () { saveRow(model)); }); getAllRows(); ... 方法saveRow类似于: $.ajax( { type: 'POST', contentType: 'application/json', url: "myUrl", data: JSON.stringify(model), success: function (data) {
$("#grid tbody tr").each(function () {
saveRow(model));
});
getAllRows();
...
方法saveRow
类似于:
$.ajax(
{
type: 'POST',
contentType: 'application/json',
url: "myUrl",
data: JSON.stringify(model),
success: function (data) {
whatever();
}
});
发生的事情是,我想为每个已更改的网格行调用saveRow
,并将其保存,当它们全部保存后,调用getAllRows
函数
当前发生的情况是,当我调用getAllRows
时,并非所有saveRow
都已完成,导致返回的数据一半已更改,一半未更改
如何确保仅在网格中的每一行的saveRow
完成后才调用getAllRows
编辑
以下是有关当前实施的更多详细信息:
// ajax function to save individual row
function saveRow() {
$.ajax(
{
type: 'POST',
contentType: 'application/json',
url: "myUrl",
success: function (data) {
whatever();
}
});
}
// array to store ajax functions called
var requests = [];
// function that iterates through all rows and saves them
$("#grid tbody tr").each(function () {
// adding the ajax function call to the array
requests.push(saveRow());
});
...
// supposedly, call getAllRows when all the saveRow ajax calls are done
$.when.apply($, requests).then(function () {
getAllRows();
});
这不起作用,在所有其他行完成之前调用
getAllRows
,您可以通过以下承诺执行操作
var d1 = $.ajax({...});
var d2 = $.ajax({...});
$.when(d1, d2 );
.then(function() {
...
})
你可以做一些承诺,比如
var d1 = $.ajax({...});
var d2 = $.ajax({...});
$.when(d1, d2 );
.then(function() {
...
})
如果异步函数不起作用-您可以尝试使用变量作为条件,即 如果要调用10个存储行,则将全局变量设为saveRowsRun=0。 在每个SaveRow函数的末尾,设置saveRownsRun++ 让函数getAllRows()在每个saveRows函数的末尾运行,但在if语句中运行
if(saveRownsRun == 10){
getAllRows();
}
这将确保if尝试在每一行之后激发,但只能在最后一行之后激发。如果异步函数不起作用,您可以尝试使用变量作为条件,即 如果要调用10个存储行,则将全局变量设为saveRowsRun=0。 在每个SaveRow函数的末尾,设置saveRownsRun++ 让函数getAllRows()在每个saveRows函数的末尾运行,但在if语句中运行
if(saveRownsRun == 10){
getAllRows();
}
这将确保if尝试在每一行之后激发,但只能在最后一行之后激发。ajax函数将为您提供一个promise对象。如果您将这些承诺传递给JQuery
$。当
函数时,它将返回另一个承诺,该承诺将在您传递的每个承诺都将得到解决时得到解决:
var promise1 = $.ajax({ /* your saveRow ajax */});
var promise2 = $.ajax({ /* your saveRow ajax */});
$.when(promise1, promise2).done(function(promise1, promise2) {
getAllRows();
});
如果要等待多个safeRow ajax,还可以使用apply
函数为函数提供一系列承诺,当函数:
var promises = [];
promises.push($.ajax({ /* your saveRow ajax */}));
promises.push($.ajax({ /* your saveRow ajax */}));
//...
$.when.apply($, promises).done(function() {
getAllRows();
});
ajax
函数将为您提供一个promise对象。如果您将这些承诺传递给JQuery$。当
函数时,它将返回另一个承诺,该承诺将在您传递的每个承诺都将得到解决时得到解决:
var promise1 = $.ajax({ /* your saveRow ajax */});
var promise2 = $.ajax({ /* your saveRow ajax */});
$.when(promise1, promise2).done(function(promise1, promise2) {
getAllRows();
});
如果要等待多个safeRow ajax,还可以使用apply
函数为函数提供一系列承诺,当函数:
var promises = [];
promises.push($.ajax({ /* your saveRow ajax */}));
promises.push($.ajax({ /* your saveRow ajax */}));
//...
$.when.apply($, promises).done(function() {
getAllRows();
});
您需要跟踪发送的请求数量,将结果添加到某个位置,并且在所有请求完成之前不进行处理。理想情况下,您还可以跟踪哪些已经完成,哪些需要完成,这样您就可以在x时间后重做那些失败的。这里的研究承诺-它内置于jQuery ajax中,jQuery deferred可以处理这种情况。所以在ajax调用中添加“asyn”:false。@Malik同步请求(webworkers之外)。您需要跟踪发送的请求数量,将结果添加到某个位置,并在所有请求完成之前不进行处理。理想情况下,您还可以跟踪哪些已经完成,哪些需要完成,这样您就可以在x时间后重做那些失败的。这里的研究承诺-它内置于jQuery ajax中,jQuery deferred可以处理这种情况。所以在ajax调用中添加“asyn”:false。@Malik同步请求(webworkers之外).可能的重复是一个很有希望的选择,但我不知道要更改多少行。那么,我如何定义未知数量的承诺呢?我更新了答案,以包含一个带有承诺数组的示例。谢谢,伙计,在你更新答案之前,我已经做到了这一点。不过我还是有一些奇怪的行为。。。可能是别的原因。我会再打给你的我快发疯了,getAllRows
在每个saveRow
完成之前被调用。当我更新5行时,网格会更新2或3条记录。。。使用浏览器检查器,我可以看到getAllRows
在其他所有操作完成之前执行。这应该行得通,Damnca你能更新你的问题吗?这是一个很有希望的选择,但我不知道有多少行需要更改。那么,我如何定义未知数量的承诺呢?我更新了答案,以包含一个带有承诺数组的示例。谢谢,伙计,在你更新答案之前,我已经做到了这一点。不过我还是有一些奇怪的行为。。。可能是别的原因。我会再打给你的我快发疯了,getAllRows
在每个saveRow
完成之前被调用。当我更新5行时,网格会更新2或3条记录。。。使用浏览器检查器,我可以看到getAllRows
在其他所有操作完成之前执行。这应该行得通,Damnca你能更新你的问题吗?你的当前实现会吗?是的,但是如果在变量==10之前跳过,那么它就不会调用GetAllRow正如我说的,我建议的代码将存在于每个saveRows()函数的末尾,所以它每次都会尝试调用它,但只会成功第10次(当满足if条件时)。是的,但是if将在变量==10之前跳过,因此它永远不会调用GetAllRow正如我所说的,我建议的代码将存在于每个saveRows()函数的末尾-因此它将尝试每次调用它,但只会在第10次成功(当满足if条件时)。