gpt4 book ai didi

javascript - 在解决初始 promise 后,如何在迭代数组时链接多个 promise ?

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:25 24 4
gpt4 key购买 nike

我有一个函数(buildMetaData),它执行以下操作

1. It receives an array(`items`) as a param
2. It invokes an DAO to fetch some data from a downstream service.
3. The downstream service responds with a promise (initial promise).
4. In the "then"(resolving initial promise), I need to modify the array passed in the param and return the modified array.

在步骤 4 中,我映射了 items 数组,在修改数组元素时,我需要调用另一个返回 Promise 数组的函数。我需要解决这个 promise 才能设置数组元素。如何将这一系列 promise 链接到最初的 promise ?

buildMetaData(items) {
return checkoutDAO.get(items[0].id)
.then((order) => {
return items.map((item) => {
let res = {};
// some processing

const promises = this.buildItemMeta({itemType: item.type, itemId: item.id})

promises.spread((product, media) => {
res.size = this.getItemSize(product, media);
});
return res;
});
});
}

buildItemMeta({itemType, itemId}) {
const promises = [
productDAO.get(itemType), // this is a promise
];
promises.push(mediaDAO.get(itemId`)); // this is a promise
return Promise.all(promises);
}

我希望新的数组具有要解析的 res.size 属性,但实际上 Promise.all 正在创建一个新的 Promise 实例,而不是链接到初始 Promise。

附:该项目使用延续本地存储(cls),cls在async/await方面存在一些已知问题,因此我无法使用async/await来解决此问题。

如果需要进一步解释,请告诉我。我感谢为回答这个问题所做的任何努力。

最佳答案

这将执行这些步骤,但是按照异步有意义的顺序。当无法使用async/await时,按程序思考可能不是解决异步问题的最佳方式。如果您有任何疑问,请告诉我。

所以这个:

  1. 它接收一个数组(items)作为参数
  2. 它调用 DAO 从下游服务获取一些数据。
  3. 下游服务以 promise (初始 promise )进行响应。
  4. 在“then”(解决初始 promise )中,我需要修改参数中传递的数组并返回修改后的数组。

现在变成这样:

  1. 它接收一个数组(items)作为参数
  2. 它检索每个项目的元数据并保存创建的 Promise 数组
  3. 它存储对下游服务的调用的 promise 。
  4. 所有 promise 均已兑现
  5. “then”传递项目元数据和订单,用作组合它们的最后阶段

请注意,我也简化了您的一些代码。

buildMetaData(items) {
const itemMetaPromises = items.map(item => this.buildItemMeta(item.type, item.id));
const orderPromise = checkoutDAO.get(items[0].id);
Promise.all([...itemMetaPromises, orderPromise])
.then(data => {
// data[0] = itemMeta([itemType,itemId]), data[1] = order
//combine order and items here
});
}

buildItemMeta(itemType, itemId) {
return Promise.all([productDAO.get(itemType),mediaDAO.get(itemId)]);
}

这是一个显示输出的模拟实现。

function buildMetaData(items) {
const itemMetaPromises = items.map(item => buildItemMeta(item.type, item.id));
const orderPromise = checkoutDAO.get(items[0].id);
Promise.all([...itemMetaPromises, orderPromise])
.then(data => {
console.log(data);
});
}

function buildItemMeta(itemType, itemId) {
return Promise.all([productDAO.get(itemType), mediaDAO.get(itemId)]);
}

checkoutDAO = {
get: () => new Promise((resolve) => {
resolve('order')
})
}
productDAO = {
get: () => new Promise((resolve) => {
resolve('product')
})
}
mediaDAO = {
get: () => new Promise((resolve) => {
resolve('media')
})
}

items = [{
type: 'itemType',
id: 'itemId'
}, {
type: 'itemType',
id: 'itemId'
}, {
type: 'itemType',
id: 'itemId'
}, {
type: 'itemType',
id: 'itemId'
}];


buildMetaData(items);

关于javascript - 在解决初始 promise 后,如何在迭代数组时链接多个 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com