我想,我已经浏览了所有关于这方面的问题。
我有一个使用 jquery 通过 ajax 更新记录的函数。我需要更改它来完成它们并等待每个完成。
我一直在阅读$.Deferred
并尝试实现,但代码仍然没有等待。我知道 ajax 是异步的,我不想改变它,但我确实希望它等待,因为代码输出消息并且我需要它们按顺序。
我的代码是这样的:
//do the export:
function doExport(id) {
var exportComplete = $.Deferred();
var exportPromise = $.ajax({
type: "POST",
url: "import.php",
dataType: "json",
data: { id: id }
});
exportPromise.done(function(msg) {
//msg contains the text from the import
exportComplete.resolve(msg);
});
return exportComplete.promise();
}
//export all ticked items (from a list)
function importInvoices() {
var checked = new Array;
$('#apiCall').html("");
//put all checked items into an array (id corresponds to a PK in the db)
$("input[name=selectedRow]:checked").each(function(num,row) {
checked.push($(row).data('id'));
});
//loop through each checked item
$(checked).map(function(num, id) {
console.log("starting " + id) ;
var prom = doExport(id).then(function(result) {
console.log("done " + id);
$('#apiCall').html($("#apiCall").html() + result.messages);
});
});
$("#pleaseWaitContainer").hide();
}
它一定很近,但我想我有什么东西不见了,或者放错了地方。结果导出的文本确实出现在它应该出现的位置,但是如果(例如)我选择 3 张发票,我会得到 3 次“开始 xxx”的控制台文本,然后是“完成 xxx”四次。
像这样:
starting 243
starting 663
starting 823
done 243
done 663
done 823
而我想要的是
starting 243
done 243
starting 663
done 663
starting 823
done 823
任何建议将不胜感激......我正在撕掉我有限的头发。
克里斯