嵌套循环中的承诺

时间:2018-08-16 11:39:57

标签: promise nosql

我有一个查询到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
    });
});

感谢您的帮助。

1 个答案:

答案 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
  })
})