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

时间:2018-01-05 03:29:12

标签: javascript promise es6-promise

这是我尝试通过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就是我想要的,但是如何在已解决的承诺中访问已解析的值。

我使用vanilla JS和一个导入文件FileSaver.js

full source code

1 个答案:

答案 0 :(得分: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]
})