我有一个查询到NoSQL数据库。由于在这种类型的数据库中,用于复杂查询的选项不多,因此我需要对循环中的其他表进行两个嵌套查询
由第一个查询创建。使用Promise,我决定读取第一个嵌套查询。但是,整个块并不是在“等待”最内部的查询,它带来的结果
(来自用户)不计在内。这是简化的代码:
该块执行以下操作:对于每个房间(最外层循环),它将读取所有消息(来自messageRef的第一个承诺),并针对每个消息读取用户数据(来自
的第二个承诺)。usersRef)。第一个嵌套查询正常(显示所有消息)。但是,每条消息的用户数据都不会被加载(在这种情况下,为简单起见,我只输入了名称)。
messageRef和usersRef对象返回存储在promises数组中的promise。最后,当全部完成时(Promise.all),它将返回包含所有数据的数组。
每个“ obj”对象都有每个房间的数据。在obj.messages中,它具有消息对象的数组,并在每个obj.messages中都有用户数据。
roomRef.on('value', function(data){
var promises = [],
threads = [],
counter = 0;
$.each(data.val(), function(id, obj){
obj.id = id;
obj.messages = [];
var promise = messageRef.child(id).on('child_added', function(data){
var msgobj = data.val();
obj.messages.push(msgobj);
return usersRef.orderByChild('login').equalTo(msgobj.createdBy.login).once('child_added', function(data){
msgobj.createdBy.name = data.val().name;
});
});
promises.push(promise);
threads[counter] = obj;
counter += 1;
});
Promise.all(promises).then(function(){
console.log(threads) // array with all data
});
});
感谢您的帮助。
答案 0 :(得分:0)
如果您需要查询,请使用查询而不是child_added事件回调。
child_added回调不是返回诺言。添加数据时触发。更改它们以查询返回承诺的信息。
roomRef.on('value', function(data) {
var promises = [],
$.each(data.val(), function(id, obj) {
obj.id = id
obj.messages = []
var promise = new Promise(resolve => {
messageRef.child(id).on('child_added', function(data) {
var msgobj = data.val()
obj.messages.push(msgobj)
usersRef
.orderByChild('login')
.equalTo(msgobj.createdBy.login)
.once('child_added', function(data) {
msgobj.createdBy.name = data.val().name
resolve(msgobj)
})
})
})
promises.push(promise)
})
Promise.all(promises).then(function(threads) {
console.log(threads) // array with all data
})
})