尝试将其作为一般用途,以便它可以帮助其他人。这个问题让我更多地与承诺的概念作斗争。
所以我有一个函数返回一个布尔变量的值。我的想法是从Firebase中提取一些数据,然后我循环遍历值...然后将变量设置为true,如果找到的话。
我遇到的问题是,无论ForEach循环和查询是否完整,都会返回该值。我尝试使用某种承诺解析(在下面的代码snippit中)正确地返回
export function CheckIfFriendsPending(id2){
var userID = getFirebase().auth().currentUser.uid
var indicator = false
var retri = function()
{
getFirebase().database().ref('members/' + userID + '/PendingFR').once('value').then(function(snap) {
console.log("~~~~~~~~~~~~~~~~~~go")
//if(result.hasOwnProperty('install_type'))
snap.forEach(function(childSnapshot) {
var childObject = childSnapshot.val()
if(childObject.hasOwnProperty('From')){
alert("OKAY")
if(childObject.From == userID && childObject.To == id2){
indicator = true
} else if(childObject.From == id2 && childObject.To == userID){
indicator = true
}
}
});
})
} // end retri
Promise.all(retri).then(function() {
return indicator
})
}
任何人都知道如何处理这个问题?我想一个汇总版本问题是如何在已经返回promise的函数中创建一个promise(我相信firebase数据库查询会这样做)。我想它必须等待“ForEach”循环完全解决。
答案 0 :(得分:8)
我认为 File "/Users/Username/Development/App_Name/app_name/models/__init__.py", line 8, in <module>
class User(db.Model):
File "/Users/Username/Development/App_Name/app_name/models/__init__.py", line 10, in User
id = db.Column(sqlalchemy.dialects.mysql.INTEGER(usigned=True), primary_key=True, autoincrement=True, nullable=False)
File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 254, in __init__
super(INTEGER, self).__init__(display_width=display_width, **kw)
File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 54, in __init__
super(_IntegerType, self).__init__(**kw)
File "/Users/Username/Development/.virtualenvs/app_name/lib/python3.5/site-packages/sqlalchemy/dialects/mysql/types.py", line 24, in __init__
super(_NumericType, self).__init__(**kw)
TypeError: object.__init__() takes no parameters
应该返回CheckIfFriendsPending
:
Promise
然后你可以打电话:
export function CheckIfFriendsPending(id2) {
return new Promise(function (resolve, reject) {
var userID = getFirebase().auth().currentUser.uid;
var indicator = false;
getFirebase().database().ref('members/' + userID + '/PendingFR').once('value')
.then(function (snap) {
function userMatch(user) {
if (!!user.From && user.From === userID && (user.To === id2 || user.To === userID)) {
return resolve();
}
}
snap.forEach(function (childSnapshot) {
var childObject = childSnapshot.val();
userMatch(childObject);
});
return reject();
});
});
}
这是一个简单的工作example。