gpt4 book ai didi

node.js - 并发(迭代)调用 Promise.all() 的函数时出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 22:23:28 25 4
gpt4 key购买 nike

这个例子是一个简化,但希望能说明我的问题。我怀疑我在这里遗漏了一些明显的回复:关闭。

问题是,从下面的聚合函数返回的结果包括 personParams 的最终集,即那些由 forEach 最终迭代产生的结果,而不是调用该函数的 personParams 集.

let promiseArray = [];  // top level array of promises

let globalParams = { date: "2018-05-20" };
let people = [
{name: "Tom",
location: "Philadelphia"},
{name: "Bob",
location: "Austin"},
{name: "John",
location: "Philadelphia"}
];

people.forEach( person => {

// Create indivdiualized parameter set
let personParams = globalParams;
personParams.name = person.name;
personParams.location = person.location;

// Push promise to array
promiseArray.push(assembleResults(personParams));

});

Promise.all(promiseArray).then( results => {
console.log("Final Output:", results);
})

// individual data aggregation function
function assembleResults(iterationParams) {

let promise1 = Promise.resolve({data: "Type A data about " + iterationParams.name});
let promise2 = Promise.resolve({data: "Type B data about " + iterationParams.name});
let promise3 = Promise.resolve({data: "Type C data about " + iterationParams.name});

return Promise.all([promise1, promise2, promise3, iterationParams])
}

更新了可执行文件 Fiddle @ JSFiddle https://jsfiddle.net/shaunhurley/9r5k6j0c/

我的期望是 assembleResults() 的每次迭代都会返回一个如下所示的数组:

[{data: "Type A data about <person's name>"},
{data: "Type B data about <person's name>"},
{data: "Type C data about <person's name>"},
{date: "2018-05-20", name: "<person's name>", location: "<location>"}]

其中每个数组的名称分别设置为“Tom”、“Bob”和“John”。最终输出将是下面的一个或多个数组。

[{data: "Type A data about Tom"},
{data: "Type B data about Tom"},
{data: "Type C data about Tom"},
{date: "2018-05-20", name: "Tom", location: "Philadelphia"}]

[{data: "Type A data about Bob"},
{data: "Type B data about Bob"},
{data: "Type C data about Bob"},
{date: "2018-05-20", name: "Bob", location: "Austin"}]

[{data: "Type A data about John"},
{data: "Type B data about John"},
{data: "Type C data about John"},
{date: "2018-05-20", name: "John", location: "Philadelphia"}]

实际结果是,虽然返回了正确的数据集,但每个数组中包含的参数集显示了生成的最后/最终参数集,即名称==“约翰”和位置==“费城”

[{data: "Type A data about Tom"},
{data: "Type B data about Tom"},
{data: "Type C data about Tom"},
{date: "2018-05-20", name: "John", location: "Philadelphia"}]

[{data: "Type A data about Bob"},
{data: "Type B data about Bob"},
{data: "Type C data about Bob"},
{date: "2018-05-20", name: "John", location: "Philadelphia"}]

[{data: "Type A data about John"},
{data: "Type B data about John"},
{data: "Type C data about John"},
{date: "2018-05-20", name: "John", location: "Philadelphia"}]

任何想法将不胜感激......

谢谢!

肖恩

最佳答案

people.forEach(person => {
let personParams = globalParams;
personParams.name = person.name;

promiseArray.push(assembleResults(personParams));
});

在上面的代码块中,您调用了person.name,我可以看到每个人都是一个字符串。所以你得到的是未定义而不是人名。我认为应该是 personParams.name = person

assembleResults() 函数的 getResultsA getResultsBgetResultsC 不应返回任何数据,除非您有一些数据名为未定义的人。

我猜这是您发布的虚拟代码。发布真实的代码将有助于我更准确地回答。

修改

下面的代码可以完成你的工作:

people.forEach((person) => {
// Create indivdiualized parameter set
const personParams = {
date: globalParams.date,
name: person.name,
location: person.location
}
// Push promise to array
promiseArray.push(assembleResults(personParams));
});

解释它是如何工作的会花费太长时间,而且我想你已经知道它为什么会这样了。请google“JavaScript 对象创建”

关于node.js - 并发(迭代)调用 Promise.all() 的函数时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50452641/

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