如何在一些承诺过程后返回新变量?

时间:2017-10-10 12:14:59

标签: javascript

getCategory().then((res) => {
  let itemList = res;
  return new Promise((resolve, reject) => {
    for(let i=0; i < res.length; i++ ) {
      getItems(res[i].url).then((itempage) => {
        const $ = itempage;
        const pagination = $('.pagination .page').toArray().length;
        itemList[i].total_page = pagination;
      });
    }
    resolve(itemList);
  });
}).then((res) => {
  console.log(res);
});

以上是我的代码。首先,我将res分配给一个名为itemList的新变量,它是一个对象数组。 然后我做了一些带有promise的函数,并尝试将新数据添加到itemList

但是,console.log(res)仍会打印出原始itemList

我知道这可能是由承诺功能引起的,但是如何修复呢?

1 个答案:

答案 0 :(得分:1)

试试这个

getCategory().then(itemList => {
  return Promise.all([itemList, Promise.all(itemList.map(x => getItems(x.url)))]);
}).then(([itemList, items]) => {
  items.forEach(($, i) => {
    itemList[i].total_page = $('.pagination .page').toArray().length;
  });
  return itemList;
}).then(console.log);

我认为那会让你到那里(即副作用itemList)。请注意,如果您的getItems次调用失败,则会失败。

这实际上是Promises的常见问题:您希望异步使用结果(就像您有选择一样),但将其与原始结果相结合。所以我在这里使用Promise.all来解析getItems调用的Promise数组,这些调用将其转换为等待所有结果的单个Promise。然后我将它放在一个包含itemList的数组中,然后在其上调用Promise.all并返回该Promise。然后,链中的下一个.then将获得一个包含两个数组的数组:原始itemList和现在已解析的getItems调用数组。此时forEach执行副作用,我们只返回现在更新的itemList