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