首页 > 解决方案 > 如何将值从 Promise.all 传递给 .then()?

问题描述

我有一个承诺链,它首先收集联系人对象,然后处理收集到的联系人。如何在 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 [DataSnapshot { node_: ChildrenNode { children_: [Object], priorityNode_: [Object], indexMap_: [Object], lazyHash_: null }, ref_: Reference { repo: [Object], path: [Object], queryParams_: [对象], orderByCalled_: false }, index_: PriorityIndex {} }, DataSnapshot { node_: ChildrenNode { children_: [Object], priorityNode_: [Object], indexMap_: [Object], lazyHash_: null }, ref_: Reference { repo : [对象], 路径: [对象], queryParams_: [对象], orderByCalled_: false }, index_: PriorityIndex {} }, DataSnapshot { node_: ChildrenNode { children_: [Object], priorityNode_: [Object],indexMap_: [Object],lazyHash_: null }, ref_: 参考 { repo: [Object], path: [Object], queryParams_: [Object], orderByCalled_: false }, index_: PriorityIndex {} } ]"
时间戳:“2019-09-08T18:50:40.259Z”
跟踪:“项目/xxxx/xxx”
}”

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

标签: javascriptfirebasefirebase-realtime-databasepromise

解决方案


看起来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);
});

推荐阅读