Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待几个ajax调用完成,然后执行一些操作_Javascript_Ajax - Fatal编程技术网

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条件时)。