这个例子是一个简化,但希望能够证明我的问题。我怀疑我错过了一些明显的问题:关闭这里。
问题是从我的聚合函数返回的结果包括 final 的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”&amp;分别是“约翰”。最终输出将是每个数组或数组。
[{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"}]
实际结果是,在返回正确的数据集时,每个数组中包含的参数集显示生成的最后/最终参数集,即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"}]
任何想法都会非常感激......
谢谢!
肖恩
答案 0 :(得分:0)
people.forEach(person => {
let personParams = globalParams;
personParams.name = person.name;
promiseArray.push(assembleResults(personParams));
});
在上面的代码块中,您调用了person.name
,我可以看到每个人都是字符串。所以你得到 undefined 而不是这个人的名字。我认为它应该是personParams.name = person
。
除了{strong> undefined < /强>
我猜这是你发布的虚拟代码。发布真实的代码可以帮助我更准确地回答。
Bellow代码可以完成你的工作:
getResultsA
解释它是如何工作的将花费太长时间,我想你已经知道为什么它会像那样。请谷歌 &#39; JavaScript对象创建&#39; 。