如何将Promise数组转换为从vanilla JS中的每个Promise解析的值的数组?

问题描述 投票:0回答:1

这就是我试图通过JSON.stringify(gamesList);序列化的内容

[{},{},{},{},{},{},{},{}]

以下是console.log(gamesList); enter image description here的打印输出

这是我的代码的一部分:

let gamesList = [];
while (hasNextPage(true)) {
    let list = getGamesList();
    gamesList = gamesList.concat(list);
}

console.log(gamesList);
Promise.all(gamesList).then((value) => {
    saveAs(
        new Blob([JSON.stringify(gamesList)]),
        'Humble_Bundle_Games.json'
    );
});

我是JS的新手,并且使用了异步代码和Promise类。我真的不知道为什么gamesList包含Promise对象,因为func返回一个包含字典/地图的列表。 getGamesList是一个异步函数阅读MDN JS文档,它看起来像Promise.all是我想要的,但idk如何在已解析的promise中访问已解析的值。

我正在使用带有一个导入文件FileSaver.js的vanilla JS

full source code

javascript promise es6-promise
1个回答
0
投票

gamesList是一系列的承诺。如果你做JSON.stringify(new Promise())它将打印{},因为它是一个对象。 Promise.all将接受一系列承诺,它将解析所有承诺并调用then方法的回调并传递已解析的值。

你的代码将成为

let gamesList = [];
while (hasNextPage(true)) {
    let list = getGamesList();
    gamesList = gamesList.concat(list);
}

console.log(gamesList);
Promise.all(gamesList).then((value) => {
    saveAs(
        value, // it contains array of all resolved values
        'Humble_Bundle_Games.json'
    );
});

只是为了理解承诺的概念:

var a = new Promise((resolve, reject) => {

  setTimeout(() => {
    resolve(10)
  }, 100)

})

var b = new Promise((resolve, reject) => {

  setTimeout(() => {
    resolve(20)
  }, 200)

});

var arr = [a, b];


Promise.all(arr).then(value => {
  console.log(JSON.stringify(arr)) // It will print [{},{}]
  console.log(JSON.stringify(value)) // It will print [10,20]
})
© www.soinside.com 2019 - 2024. All rights reserved.