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
。
我知道这可能是由承诺功能引起的,但是如何修复呢?
答案 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
。