javascript - 如何减少多个Promise.all?

时间:2017-04-16 04:16:25

标签: javascript promise reduce

我正在尝试使用Promise.all内的reduce并且无法使function工作,除非我的数组中只有一个用户。 reduce的起始对象是Promise。第一次通过reducePromise上有.all可用。第二次,.all无效。

return UserQueries.addUsersOnCasefileCreate(input).then(users => {
  return users.reduce((promise, user) => {
    return promise.all([
      AddressQueries.addAddress(user.address, user.userId, input.orgId),
      EmailQueries.addEmail(user.emails, user.userId, input.orgId),
      PhoneQueries.addPhones(user.phones, user.userId, input.orgId)
    ])
    .then(() => Promise.resolve(user))
  }, Promise);
})

我该如何执行此操作?

2 个答案:

答案 0 :(得分:1)

使用Promise初始化这是一个函数,但返回一个已解析的Promise对象,其中两个不一样。

您可以使用Promise.resolve()进行初始化,致电promise.then(),然后返回Promise.all().then()在第一个.then()内链接,Promise传递.reduce()个对象到return UserQueries.addUsersOnCasefileCreate(input).then(users => { return users.reduce((promise, user) => { return promise.then(() => Promise.all([ AddressQueries.addAddress(user.address, user.userId, input.orgId), EmailQueries.addEmail(user.emails, user.userId, input.orgId), PhoneQueries.addPhones(user.phones, user.userId, input.orgId) ])) .then(() => user)) }, Promise.resolve()); }) 的下一次迭代。

//if key not exists insert key    
    if(!map.containsKey(key)){
           List<Integer> list = new ArrayList<Integer>();
           list.add(value);
           map.put(key,list);
        }
    //if key exists do this...
    else{
          List<Integer> list = new ArrayList<Integer>();
          //Getting previous existing elements on map at that index and adding to list back
          list.addAll(map.get(key));
          map.put(list);
        }

答案 1 :(得分:1)

无需使用reduce()。只需映射事物并等待它们。

return UserQueries.addUsersOnCasefileCreate(input).then(users => {
  return Promise.all(users.map((user) => {
    return Promise.all([
      AddressQueries.addAddress(user.address, user.userId, input.orgId),
      EmailQueries.addEmail(user.emails, user.userId, input.orgId),
      PhoneQueries.addPhones(user.phones, user.userId, input.orgId)
    ]);
  }));
});