我有一个上传按钮,当点击调用一个ajax函数来上传文档。一旦该函数运行,我将调用另一个ajax函数来刷新屏幕上显示所有文档的表。我一直在研究这个问题- Wait until all jQuery Ajax requests are done?
这似乎是我所需要的。但是,我不确定如何为我的当前代码实现。我有:
$("#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);
}
});
}
我的refreshTable
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;
}
如果我用当前的解决方案上传了一个文档,那么refreshTable
的成功功能似乎被击中得太快了,而且它没有上传最新的文件。我曾尝试在我的refreshTable()
的成功函数中添加对doUpload
的调用,其setTimeout
值为5秒,有时这是在运行并刷新表,但有时它并不是在上传表。
然后,我将按钮上的单击处理程序更改为下面的按钮,以尝试具有我所链接到的其他StackOverflow答案所具有的功能,但这也不起作用。
$("#UploadButton").on('click', function () {
$.when(doUpload()).done(function() {
refreshTable();
});
});
发布于 2014-11-02 21:12:27
您可以使用回调机制。
function doUpload(callback) {
$.ajax({ //some parameters
success: function (data) {
//do some work here
callback();
}
);
}
然后,您可以按以下方式调用该功能链:
doUpload(refreshTable);
发布于 2014-11-02 21:15:59
编辑:@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();
}
}
https://stackoverflow.com/questions/26704442
复制相似问题