Firebase 云函数中的多个数据库调用

Firebase 云函数中的多个数据库调用,firebase,firebase-realtime-database,google-cloud-functions,Firebase,Firebase Realtime Database,Google Cloud Functions,我有一个可调用的Cloudfunction,它可以获取多个数据。 从何处提取的键由函数计算 我有一个这样的数组 var keys = ["key1", "key2, "key5"] 问题是keylist的长度是可变的,我想将从数据库中收集的所有数据以给定的键发送回用户 大概是这样的: result = { key1: value, key2: value, key5: value, } 数据库只提供非asnyc的期票。 一旦收集了所有数据,我如何确保我只提供数据。 差不多 adm

我有一个可调用的Cloudfunction,它可以获取多个数据。 从何处提取的键由函数计算

我有一个这样的数组

var keys = ["key1", "key2, "key5"]
问题是keylist的长度是可变的,我想将从数据库中收集的所有数据以给定的键发送回用户

大概是这样的:

result = {
  key1: value,
  key2: value,
  key5: value,
}
数据库只提供非asnyc的期票。 一旦收集了所有数据,我如何确保我只提供数据。 差不多

admin.database().ref('/path/key1').once('value').then( snapshot => {
  admin.database().ref('/path/key2').once('value').then ( snapshot => {
    ...
  }
}

不起作用,因为键的数量是可变的。

我设法找到了解决问题的方法

我必须编写一个递归函数来链接承诺

function fetchData(keyArray) {
  var index = 0;
  var fetchedValues = {};

  return new Promise(function(resolve, reject) {
    function next(fetchedValues) {
      if (index < keyArray.length) {
        newFetchedValues = fetchedValues;
        admin.database().ref('/path/to/key/' + keyArray[index]).once('value').then(((snapshot) => {
          newFetchedValues[keyArray[index]] = snapshot.val();
          index++;
          next(newFetchedValue);
        }), reject);
      } else {
        resolve(fetchedValues);
      }
    }
    next(fetchedValues);
  });
}
函数获取数据(keyArray){
var指数=0;
var fetchedValues={};
返回新承诺(功能(解决、拒绝){
函数next(fetchedValues){
if(索引{
newFetchedValues[keyArray[index]]=snapshot.val();
索引++;
next(newFetchedValue);
}),拒绝);
}否则{
解析(获取值);
}
}
下一步(获取值);
});
}
一旦获取数组中的所有值,此函数将返回一个promise对象,该对象可以解析状态。 这允许同步获取动态数量的值

我按照这个问题的第一个答案解决了这个问题

所有这些听起来都是可行的。有什么问题吗?在实现这一点的过程中,您在哪里遇到了困难?正如前面所说,我只获得承诺变量,不能使用wait,要等待结果将所有内容添加到一起,请更新您的问题以包含。如果没有这一点,除了为您编写代码之外很难有所帮助,这不是堆栈溢出的原因。谢谢@frankvanpoffelen我正要这么做。如果您在数组中收集对
once()
的调用的所有承诺,然后使用
Promise.all()
在另一个数组中接收所有结果。很酷,谢谢,伙计,这是我找到解决方案时一直在寻找的东西。