【问题标题】:How do I pass values from a Promise.all to .then()?如何将值从 Promise.all 传递给 .then()?
【发布时间】:2019-09-09 06:20:17
【问题描述】:

我有一个承诺链,它首先收集联系人对象,然后处理收集到的联系人。如何在 Promise.all() 之后将联系人传递给 .then() 部分?

let collectUserDataPromise = []
allUsers.forEach((userId) => {
  //Collect all contacts
  collectUserDataPromise.push(
    dbRoot.child(`users/${userId}`)
    .once('value', (userSnapshot)=>{
      const userNodeData = userSnapshot.val()
      const contactObject = {
        alias: (userNodeData.alias) ? userNodeData.alias : '',
        name: (userNodeData.name) ? userNodeData.name : '',
        status: 'active'
      }
      console.log('contactObject', contactObject)
      //return contactObject
      return new Promise((resolve, reject)=> resolve([contactObject]))
    })
  )
})

Promise.all(collectUserDataPromise)
.then((contactObjects)=>{
  console.log('contactObjects', contactObjects)

我的日志显示我已正确收集对象,但我似乎无法将其传递到代码示例中最后一行的 .then() 部分。

.once() 部分的日志

"contactObject { 别名:'Donald',名称:'Donald D',状态:'active'}"
"contactObject { 别名:'Mickey',名称:'Mickey M',状态:'active'}"

.then() 部分的日志

"contactObjects [数据快照{ 节点_: 子节点 { children_:[对象], priorityNode_:[对象], indexMap_:[对象], lazyHash_: null }, 参考: 参考 { 回购:[对象], 路径:[对象], queryParams_:[对象], orderByCalled_: false }, index_: PriorityIndex {} }, 数据快照 { 节点_: 子节点 { children_:[对象], priorityNode_:[对象], indexMap_:[对象], lazyHash_: null }, 参考: 参考 { 回购:[对象], 路径:[对象], queryParams_:[对象], orderByCalled_: false }, index_: PriorityIndex {} }, 数据快照 { 节点_: 子节点 { children_:[对象], priorityNode_:[对象], indexMap_:[对象], lazyHash_: null }, 参考: 参考 { 回购:[对象], 路径:[对象], queryParams_:[对象], orderByCalled_: false }, index_: PriorityIndex {} } ]"
时间戳:“2019-09-08T18:50:40.259Z”
跟踪:“项目/xxxx/xxx”
}"

如何将所有收集到的值从 Promise.all() 传递到 Promise 链的 .then() 部分?

【问题讨论】:

  • 我不明白。你在最后记录then 中的对象,问为什么then 没有收到它们?
  • 为什么是return new Promise((resolve, reject)=> resolve([contactObject]))?为什么不只是return [contactObject]?为什么它是一个数组?
  • 嗨@rayhatfield!感谢您的答复!你是对的,我不需要传递一个数组,这纯粹是为了测试目的。日志的大部分来自 .then() 部分。我已经更新了我的帖子以澄清。 :) 我通过“return contactObject”得到了相同的结果

标签: javascript firebase firebase-realtime-database promise


【解决方案1】:

看起来你代码的dbRoot.child('...').once('...') 部分本质上是你想要存储在collectUserDataPromise 数组中的Promise。这意味着您不需要像以前那样创建自己的 Promise(return new Promise 等)。

尝试以下方法并告诉我有帮助:

let collectUserDataPromise = [];

allUsers.forEach(userId => {
  //Collect all contacts
  collectUserDataPromise.push(
    dbRoot
      .child(`users/${userId}`)
      .once("value")
      .then(userSnapshot => {
        const userNodeData = userSnapshot.val();
        const contactObject = {
          alias: userNodeData.alias ? userNodeData.alias : "",
          name: userNodeData.name ? userNodeData.name : "",
          status: "active"
        };
        //return contactObject
        return contactObject;
      })
  );
});

Promise.all(collectUserDataPromise).then(contactObjects => {
  console.log("contactObjects", contactObjects);
});

【讨论】:

  • 重要的一步是从将回调传递给once 切换到在它返回的promise 上使用.then() 调用
  • 非常感谢 Alex 的出色回答!并感谢@Bergi 指出了关键的区别!你是救生员! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2014-07-13
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多