首页 > 解决方案 > 使用 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? 
}

标签: javascriptarrays

解决方案


你的问题是解决的顺序。也就是说,当您的代码执行时,会发生以下情况:

0.) Arr = []

1.) 开始循环

2.) 发起承诺

3.) 记录 arr

4.) 循环结束

5.) 记录 arr

6.) 在未来的某个未定义的时间点,几毫秒后,你的 Promise 解决了,一次一个,每个都将元素添加到数组中。

尝试在数组中捕获承诺并使用

Promise.all(promiseArr).then(()=>{
    console.log(arr)
})

Promise.all 将等到数组中的所有 Promise 都完成后再执行,因此您将能够记录已完成的数组。


推荐阅读