首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待jQuery AJAX调用完成

等待jQuery AJAX调用完成
EN

Stack Overflow用户
提问于 2014-11-02 21:09:19
回答 2查看 391关注 0票数 1

我有一个上传按钮,当点击调用一个ajax函数来上传文档。一旦该函数运行,我将调用另一个ajax函数来刷新屏幕上显示所有文档的表。我一直在研究这个问题- Wait until all jQuery Ajax requests are done?

这似乎是我所需要的。但是,我不确定如何为我的当前代码实现。我有:

代码语言:javascript
运行
复制
$("#UploadButton").on('click', function () {
           doUpload(); // My First AJAX function
           refreshTable(); // My Second AJAX Function
       }); 

我的doUpload AJAX函数如下:

代码语言:javascript
运行
复制
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);
            }
        });
    }

我的refreshTable ajax函数是:

代码语言:javascript
运行
复制
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;
}

如果我用当前的解决方案上传了一个文档,那么refreshTable的成功功能似乎被击中得太快了,而且它没有上传最新的文件。我曾尝试在我的refreshTable()的成功函数中添加对doUpload的调用,其setTimeout值为5秒,有时这是在运行并刷新表,但有时它并不是在上传表。

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

代码语言:javascript
运行
复制
$("#UploadButton").on('click', function () {
            $.when(doUpload()).done(function() {
               refreshTable();                
             });
        }); 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-02 21:12:27

您可以使用回调机制。

代码语言:javascript
运行
复制
function doUpload(callback) {
    $.ajax({ //some parameters
        success: function (data) {
            //do some work here
            callback();
        }
    );
}

然后,您可以按以下方式调用该功能链:

代码语言:javascript
运行
复制
doUpload(refreshTable);
票数 2
EN

Stack Overflow用户

发布于 2014-11-02 21:15:59

编辑:@qamyoncu的答案比我的好。

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

这里有一个避免问题的棘手的解决方案:

代码语言:javascript
运行
复制
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();
        }
    }
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26704442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档