javascript - jquery 同步 ajax 仅在循环结束时附加到 html
问题描述
我需要多次运行 php 脚本,但需要使用唯一的 ID。该脚本每次运行需要 +- 5 秒(将一些文件下载到服务器等..)首先我使用 ajax 调用来执行此操作,但问题是这需要按顺序进行,并且使用默认的 ajax 设置多个实例被运行的同时给出了奇怪的东西。我将参数 'async' 更改为 'false' 解决了这个问题,因为现在 javascript 在开始下一次迭代之前等待脚本完成。
控制台警报每 5-6 秒弹出一次,我从每个帖子中提醒数据,然后循环等待我单击警报(好)。
我没有提醒我尝试将数据附加到 div,它仅在所有迭代完成后才附加。
为什么?
var arr = ["10","20","30"];
$("button").click(function(){
$.each(arr, function( index, value ) {
console.log( index + ": " + value );
$.ajax({
url: "import_xml_single_post.php",
type: "post",
data: {'import_id' : value},
async: false,
success: function(data){
$( "#result" ).append( data );
//alert(data);
}
});
});
<body>
<button>Click me</button>
<div id="result"></div>
</body>
解决方案
这是因为浏览器的 UI 线程被 ajax 请求占用,所以浏览器没有机会重新绘制页面。这就是为什么要避免使用同步 ajax 的原因之一。
这些请求不需要同步。如果您希望它们串行完成(而不是并行),只需在完成前一个请求时触发后续请求:
var arr = ["10", "20", "30"];
$("button").click(function() {
var index = 0;
// Start the process
doOne();
function doOne() {
// Get this value
var value = arr[index++];
console.log(index + ": " + value);
$.ajax({
url: "import_xml_single_post.php",
type: "post",
data: {
'import_id': value
},
success: function(data) {
$("#result").append(data);
},
complete: function() {
// Kick off the next request
if (index < arr.length) {
doOne();
}
}
});
}
});
在尖端环境(或使用转译)中,您可以使用一个async
函数,这样您就可以编写异步运行的同步代码:
var arr = ["10", "20", "30"];
$("button").click(async function() {
// ---------------^^^^^
try {
for (const value of arr) {
console.log(value);
await $.ajax({
// -----^^^^^^
url: "import_xml_single_post.php",
type: "post",
data: {
'import_id': value
},
success: function(data) {
$("#result").append(data);
}
});
}
} catch (e) {
// Handle/report error doing request
}
});
try
在函数的整个主体周围有一个/非常重要catch
,因为否则将不会处理 ajax 调用中的错误(因为 jQuery 中的任何内容都不会对async
函数返回的 promise 做任何事情)。
推荐阅读
- mongodb - MongoDB:根据条件从文档列表中选择文档
- c++ - 将对象移动到 unique_ptr
- mysql - SQL查询以查找员工的报告员
- python - Discord 频道会员只返回一名会员?
- javascript - 为什么这个标签在 sendgrid 内的 html 标签内不起作用?
- node.js - Nodejs AsyncLocalStorage getStore() 返回未定义
- java - MapType 在 Spark 3.x 中导致 AnalysisException:Encoders.bean 到包含地图的对象
失败,在 Spark 2.4 中运行良好 - android - 代理后面的 AVD 模拟器没有互联网
- javascript - 带有连接或大小写的 mysql 条件子查询
- c++ - if-else 语句无法正常工作的奇怪错误