javascript - 使用 Promise 将元素推入数组
问题描述
当我 console.log 我的数组时它仍然是空的,所以我无法使用我的代码将元素推送到数组中。我可以在函数之外做到这一点,但不知道我在这里做错了什么。我是新的承诺。感谢您的任何提示:
function fetchApiData(num) {
let arr = [];
for(let i = 0; i < num; i++) {
fetch('https://dog.ceo/api/breeds/image/random')
.then(response => response.json())
.then(responseJson => console.log(responseJson.message))
.then(responseJson => arr.push(responseJson.message));
console.log(arr);
}
console.log(arr);
// how do I change console.log to push value into an array?
}
解决方案
你的问题是解决的顺序。也就是说,当您的代码执行时,会发生以下情况:
0.) Arr = []
1.) 开始循环
2.) 发起承诺
3.) 记录 arr
4.) 循环结束
5.) 记录 arr
6.) 在未来的某个未定义的时间点,几毫秒后,你的 Promise 解决了,一次一个,每个都将元素添加到数组中。
尝试在数组中捕获承诺并使用
Promise.all(promiseArr).then(()=>{
console.log(arr)
})
Promise.all 将等到数组中的所有 Promise 都完成后再执行,因此您将能够记录已完成的数组。
推荐阅读
- c# - 使用 Oauth2 从 Xero API 获取基于联系人姓名的联系人详细信息
- django - Django (DRF) 序列化程序和 MariDB 版本控制表
- vba - 强制人们启用 Word 宏
- typescript - Svelte 允许无效的打字稿
- python - 单个位置索引器超出范围
- java - JavaFX 11 可编辑组合框抛出 IndexOutOfBoundsException
- sql - 如果控件为空(IS NULL),则访问多条件查询以包括空白/空记录
- c - STM32G0 bootloader内存扩展问题
- html - 在 div 的标题内显示实体定义
- macos - Running 32 bit address space code on Mac M1 chip