gpt4 book ai didi

javascript - 将同步 firebase 函数重写为异步

转载 作者:行者123 更新时间:2023-11-30 21:45:58 25 4
gpt4 key购买 nike

我习惯用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();
});
}

最佳答案

您正在寻找的是 Promise.all()。 Firebase 的 once() 方法返回一个 promise ,并且 Promise.all() 解析(即调用它的 then() 方法一次你给的所有 promise 它已解决)。

所以:

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]);

关于javascript - 将同步 firebase 函数重写为异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49480826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com