【发布时间】:2017-10-13 14:47:05
【问题描述】:
对 promises 不熟悉,想学习。 我有这个 shopIds 数组:
let shopIdsArray = ['shop1','shop2','shop3'];
和一个外部承诺调用
getProducts(shopId, 'products') //promise returns the products of this shop
不幸的是,promise 不返回 shopId,只返回产品,所以我必须以某种方式保留 shopId 并在 promise 完成后将其与产品一起存储。 我目前的方法是使用每个 shopId 调用 promise,并将每个 promise 调用的结果添加到 storesAndProductsArray,如下所示:
shopsAndProductsArray.push({
"id":shopId,
"products":products
});
稍后,我的“包装承诺”应该返回完成的 shopAndProductsArray。
我当前的代码(节点,ES6)看起来像:
updateProducts = new Promise(
function (resolve, reject) {
let shopIdsArray = ['shop1','shop2','shop3'];
const shopsAndProductsArray = [];
let promisesArray = [];
shopIdsArray.forEach((shopId) => {
let promise = getProducts(shopId, 'products')
.then((products) => {
const shopInfoObject = {
"id":shopId,
"products":products
};
console.log("sio: ",shopInfoObject); //prints shopIds and products fine.
shopsAndProductsArray.push(shopInfoObject);
promisesArray.push(promise);
});
});
Promise.all(promisesArray)
.then(function (shopsAndProductsArray) {
resolve(shopsAndProductsArray); //the shopsAndProductsArray is undefined?
});
}
);
解析时,shopsAndProductsArray...不是空的,而是包含与 shopIdsArray 相同数量的条目,但数组项未定义。我可能应该先将 Promise 放入一个数组中,然后在 Promise.all 中处理它们,但那时我失去了对 Promise 所属商店 ID 的引用。
我阅读了许多有关迭代和承诺的其他示例,并尝试了许多其他方法,但似乎我还没有完全理解此时所谓的什么。我确定以我的方式填充 promises 数组是错误的,但我不知道如何调用 Promise.all。
我想我可以将我的问题缩小到:
- 我应该如何遍历 shopIds,调用 promise 每个?
- 如何在 promise 返回产品列表后保留 shopId?
- 处理完所有 shopId 后,如何返回 shopId 和产品数组?
提前感谢您的帮助。
编辑: 非常感谢,justelouise 和 Felix Kling。我知道我把事情复杂化了,但不能把手指放在哪里。感谢您的示例,我现在了解我所缺少的内容。 我认为您的答案基本上是相同的,并且都得到了彻底的解释。我给 justelouise 打了接受复选标记,因为她似乎是第一个,而且 Felix Kling 的声望略高 O_o。
【问题讨论】:
-
您正在调用
shopsAndProductsArray.push(exchangeInfoObject);,但您创建的对象已分配给shopInfoObject。 -
您的所有承诺都解析为
undefined- 因为您的.then(products =>不返回任何内容......这就是为什么shopsAndProductsArray是一个未定义的function (shopsAndProductsArray)数组 -
注意:您的
const shopsAndProductsArray = [];永远不会用于任何事情 -
顺便说一句——不包括console.logging,
var updateProducts = Promise.all(['shop1', 'shop2','shop3'].map(id => getProducts(id, 'products').then(products => ({id, products}))));可能就是你想要的 -
@Felix,我更正了代码。
标签: javascript node.js promise es6-promise