将同步firebase函数重写为异步

wbrvyc0a  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(114)

我习惯使用Mysql,通常我会这样做:

function foo(userId){
 $gender = getGender($userId); 
 //getGender returns result of SQL query: SELECT gender FROM users WHERE uid = $userId
return $gender;
}

这种方法不适用于Firebase,因为它是异步的。我知道我可以做这样的事情:

ref.child(userId +'/gender').once('value').then(function(snap => {
 doSomethingWithGender(snap.val());
});

但是,由于我使用的函数带有 * 两个或更多 * 参数(这些参数是数据库查询的结果),因此这种方法不能解决这个问题。是否有一种方法可以将异步函数传递给一个函数,等待它们完成,然后执行该函数?
更具体地说,我想实现这样的目标:

function compareUsers(u1,u2){
  var totalScore = 0;
  var n = countAnswers(u1,u2);
  for(i = 1 ; i <= n ; i++){
    var weight = compare(getResponse(u1, i), getResponse(u2, i));
totalScore = totalScore + weight;
}
  var score = totalScore/n;
  console.log(score);
}
function countAnswers(u1,u2){
  var dimension = getMin(getMaxKey(u1), getMaxKey(u2));
}
function getMaxKey(uID){
  var ref = db.ref("score/" + uID);
  return ref.orderByChild('id').limitToLast(1).once("value").then(snap => {
    return snap.key;
  });
}
function getResponse(uID, qID){
  var ref = db.ref("answer/" + uID + "/" + qid);
    return ref.child('answer').once("value").then(snap => {
      return snap.val();
  });
}
62o28rlo

62o28rlo1#

你要找的是Promise.all(),Firebase的once()方法返回一个promise,然后Promise.all()解析(也就是说,一旦你给它的所有promise都被解析,就调用它的then()方法)。
因此:

Promise.all([getMaxKey(u1), getMaxKey(u2)]).then(function(keys) {
  console.log(keys[0], keys[1]);
});

如果您处于async环境中:

const keys = await Promise.all([getMaxKey(u1), getMaxKey(u2)]);
console.log(keys[0], keys[1]);

相关问题