javascript - 等待循环内的异步调用完成
问题描述
我知道类似的问题已经被问过很多次了,但有些问题已经过时并提出了不推荐使用的解决方案,有些描述了一个解决方案,但不是在循环的上下文中,而且没有一个直接回答我的问题。我想知道在另一段代码运行一堆异步调用之后运行一段代码的最新和最好的方法是什么。
这是我拥有的代码的一般结构:
function fetchProperty(input) {
$.ajax({
url: 'https://jsonplaceholder.typicode.com/todos/1' + input
}).done(function(resp){
return $.parseJSON(resp).title;
});
}
inputValues = [1, 2];
outputValues = [];
$.each(inputValues, function(index, value){
outputValues.push(fetchProperty(value));
});
console.log(outputValues); // will return an empty array
本质上,我希望在所有 AJAX 调用$.each()
都完成之后才执行最后一行代码。显然,我不想使用它,async: false
因为它已被弃用。console.log
在所有其他延迟的 AJAX 调用完成后如何延迟的最佳实践是什么?
解决方案
尝试使用异步等待,如下面的代码所示。问题似乎是获取是异步的,但控制台日志不是,所以它在获取数据之前打印
async function fetchProperty(input) {
const resp = await $.ajax({
url: 'http://some.api/' + input + '/foobar'
});
return $.parseJSON(resp).someProperty;
}
inputValues = ['this', 'that'];
outputValues = [];
$.each(inputValues, async function(index, value){
outputValues.push(await fetchProperty(value));
});
console.log(outputValues);
推荐阅读
- huawei-mobile-services - 调用AchievementsClient.getAchievementList接口获取成就返回结果码7002
- c++ - 如何捕获引发硬件中断的异常?
- php - 使用 Redis 和 MySQL 加载和更新数据的最佳实践是什么?
- c# - 如何绑定 ObservableCollection 中所有项目的 Time-Dependent-Property
到一个文本框? - html - 如何将 HTML 小部件的值从 HTML 表单传递到 eXist-db 中的 Xquery?
- julia - 不使用 JuMPeR 是否可以建立相关的鲁棒优化模型
- ruby-on-rails - Rails 模型中的两级命名空间
- vue.js - Nuxt Prerender 与 Thymeleaf 不匹配
- c# - 在 AppService 中启动 ASP.NET Core 主机之前捕获并记录错误
- c++ - 使用 cin 验证用户输入