调用Promise.all()

时间:2018-05-21 16:05:49

标签: node.js es6-promise

这个例子是一个简化,但希望能够证明我的问题。我怀疑我错过了一些明显的问题:关闭这里。

问题是从我的聚合函数返回的结果包括 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"}]

任何想法都会非常感激......

谢谢!

肖恩

1 个答案:

答案 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;