0

我想将数据从承诺推送到数组(coursesArray),然后在其他地方使用数组值。我正在使用node-fetch库来查询 API。目前,当我在 Promise 内记录数组时,它有值(coursesOne)但是当我在 Promise 之外记录数组时,它是空的(coursesTwo)。我如何着手实施理想的解决方案,以便在getCoursesForSitemap()执行时以数据填充课程数组

这是我迄今为止实施的

const coursesArray = [];

const getCoursesForSitemap = () => {
  fetch(coursesUrl)
    .then(res => res.json())
    .then(json => {
      json.courses.results.map(course => {
        return coursesArray.push(course.slug);
      });
      console.log('coursesOne', coursesArray);
    })

    .catch(error => {
      console.log(error);
    });
};
getCoursesForSitemap();
console.log('coursesTwo', coursesArray);
4

2 回答 2

1

重构你的代码以使用async/ await,而不是让它改变 out-of-closure/global 变量,这应该适合你。

const getCoursesForSitemap = async () => {
  const result = await fetch(coursesUrl);
  const json = await result.json();
  return json.courses.results.map(course => course.slug);
};
const coursesArray = await getCoursesForSitemap();
console.log('coursesTwo', coursesArray);

如果您的环境不支持顶级 async/await,您需要在例如 IIFE 中执行异步代码:

(async function() {
  const coursesArray = await getCoursesForSitemap();
  console.log('coursesTwo', coursesArray);
}());

(该函数还将返回一个您可以.then()await在...上的承诺)

于 2019-11-04T16:26:25.050 回答
0

您正在尝试在值从您的承诺中解决之前记录它们。这就是为什么它不起作用。在尝试显示它们之前,您需要等待 Promise 解决。

您还需要返回承诺。

const coursesArray = [];

const getCoursesForSitemap = () => {
  return fetch(coursesUrl)
    .then(res => res.json())
    .then(json => {
      json.courses.results.forEach(course => {
        return coursesArray.push(course.slug);
      });
      console.log('coursesOne', coursesArray);
    })

    .catch(error => {
      console.log(error);
    });
};
getCoursesForSitemap().then(() => {
    console.log('coursesTwo', coursesArray);
});

我还更改了map您用于 a 的函数,forEach因为您不需要更改json.courses.results数组的值。

于 2019-11-04T16:26:17.603 回答