javascript - 如何使 ajax 同步而不是使用 async:false?
问题描述
我在使用 ajax 异步时遇到了一些问题。我有一个数组,然后循环遍历数组以进行 ajax 调用,如果成功,ajax 将返回一个 xml 字符串,我将使用它来填写表格并更新进程栏。我async:false
在 Firefox 上使用它可以正常工作,但在 Chrome 上无法正常工作。我也尝试使用$.ajax().done()
,但它根本没有影响。
当ajax调用完成然后下一个循环将运行时,是否有得到响应的xml字符串?
for (var i = 0; i <= arr.length; i++){
$.ajax({
url: '',
data: '',
async: false
}).done(function(xml) {
//get xml string to handle and put it into some table as contents
});
//Then go to next loop
}
解决方案
不要试图使异步代码同步。您将锁定事件循环并获得令人讨厌的性能损失。
并行提出请求。将 Promise 收集到一个数组中。用于Promise.all
确定它们何时全部完成。
然后,您可以从中提取数据并按照您的意愿进行操作。
例如:
const baseUrl = "https://jsonplaceholder.typicode.com/users/";
const userIds = [1,2,3,4,5];
const completeUrls = userIds.map( id => `${baseUrl}${id}` );
const promises = completeUrls.map( url => jQuery.ajax({url}) );
const collectedDataPromise = Promise.all(promises);
collectedDataPromise.then( data => {
const names = data.map( user => user.name );
const ul = $("<ul />");
names.forEach( name => {
ul.append( $("<li>").text(name) );
});
$("body").append(ul);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
推荐阅读
- visual-studio-code - 在VSCode中查找和擦除“等于”不同字符串的相同属性?
- mysql - 为什么这段代码能够在 HAVING 中使用来自 SELECT 的别名?
- java - 将 JScrollPane 中的选定项目移动到列表顶部并在 java 中显示剩余项目
- python - 在mac中将mitmdump作为后台进程执行
- php - 无法访问新创建的 wordpress 表
- okta - OKTA SCIM API 中不存在的用户更新请求的响应是什么?
- youtube - 使用 YouTube API 搜索频道返回错误结果
- javascript - 使用 Jquery 为多个 API 调用显示动画文本
- html - 如何在angular的打字稿文件中访问formarray值
- ruby - 如何重构一个简单的长 case 语句