Javascript 等待jQueryAjax调用完成

Javascript 等待jQueryAjax调用完成,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个上传按钮,当点击时调用ajax函数来上传文档。一旦该函数运行,我调用另一个ajax函数来刷新屏幕上显示所有文档的表。我一直在研究这个问题- 这似乎是我需要的。然而,我不知道如何为我当前的代码实现。我有: $("#UploadButton").on('click', function () { doUpload(); // My First AJAX function refreshTable(); // My Second AJAX Funct

我有一个上传按钮,当点击时调用ajax函数来上传文档。一旦该函数运行,我调用另一个ajax函数来刷新屏幕上显示所有文档的表。我一直在研究这个问题-

这似乎是我需要的。然而,我不知道如何为我当前的代码实现。我有:

$("#UploadButton").on('click', function () {
           doUpload(); // My First AJAX function
           refreshTable(); // My Second AJAX Function
       }); 
我的
doUpload
AJAX函数如下:

function doUpload() {
        $.ajax({
            url: 'myupload url',
            type: 'POST',
            data: new FormData($('#uploadForm')[0]),
            processData: false,
            contentType: false,
            success: function () {
                $.growlUI('Document Uploaded Sucessfully');
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.status + " " + thrownError);
            }
        });
    }
我的
refreshttable
ajax函数是:

function refreshTable() {
    $.ajax({
        url: 'url to get all files',
        type: 'GET',
        data: $('#searchForm').serialize(),
        success: function (data) { populateTable(data); },
        error: function (xhr, ajaxOptions, thrownError) { alert(xhr.status + " " + thrownError); }
    });
    return false;
}
如果我使用当前解决方案上载文档,
refreshttable
的成功功能似乎被点击得太快,并且没有“查找上载的最新文件”功能。我曾尝试在我的
doUpload
的success函数中添加对
refreshttable()
的调用,调用时间为
setTimeout
,时间为5秒,有时这会起作用并刷新表,但有时不会上载表

然后,我将按钮上的单击处理程序更改为下面的,以尝试使用我上面链接的另一个StackOverflow答案所具有的功能,但这也不起作用

$("#UploadButton").on('click', function () {
            $.when(doUpload()).done(function() {
               refreshTable();                
             });
        }); 

您可以使用回调机制

function doUpload(callback) {
    $.ajax({ //some parameters
        success: function (data) {
            //do some work here
            callback();
        }
    );
}
然后您可以调用函数链,如下所示:

doUpload(refreshTable);

编辑:@qamyoncu答案比我的好

在AJAX中,调用是异步完成的。这就是为什么你得不到你想要的

下面是一个棘手的解决方案,可以避免您遇到的问题:

function doUpload(init) {
        var res = null;
        var _init = init || false;

        if (!_init) {
            _init = true;
            $.ajax({
                /// ajax call for doUpload()...
            });
        }

        if (res == null) {
            setTimeout(function(){ doUpload(_init); }, 100);
        } else {
            refreshTable();
        }
    }

回调似乎正在工作,但刷新表函数仍然很早就被点击以获取新上传的文件-在回调执行之前,我是否可以添加额外的延迟?JS中有
setTimeout
函数,但我提供的代码应该适合您。您确定没有添加
刷新表的
()
?@theridler,正常工作。你能用小提琴喂我吗?