Javascript 如何从数据库异步获取数据?

Javascript 如何从数据库异步获取数据?,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我在两个用户之间创建了一个聊天应用程序。当客户端被加载时,user1被分配一个值,而user2在开始时是未定义的。当用户单击屏幕截图左侧的“用户列表”按钮时,将分配user2。现在我有了user1和user2,所以现在我想得到user1和user2之间的所有数据,但是我得到了一个空数组。单击后设置user2时,如何调用conversation.find({$and:[{user1:user1},{user2:user2}]}) 注意:conversation.find({})工作正常,但conv

我在两个用户之间创建了一个聊天应用程序。当客户端被加载时,user1被分配一个值,而user2在开始时是未定义的。当用户单击屏幕截图左侧的“用户列表”按钮时,将分配user2。现在我有了user1和user2,所以现在我想得到user1和user2之间的所有数据,但是我得到了一个空数组。单击后设置user2时,如何调用
conversation.find({$and:[{user1:user1},{user2:user2}]})

注意:
conversation.find({})
工作正常,但
conversation.find({$and:[{user1:user1},{user2:user2}]})
不工作

以下代码不起作用:

let conversation = db.collection('conversation'); 
  let user1,user2;

      socket.on('GET_USER', function (data) {
        console.log(data);
         user2 = data.user2;
      });

      socket.on('LOGGEDIN_USER', function(data) {
        console.log(data);
         user1 = data.user1;

         console.log("This is user1 "+ user1)
         console.log("This is user2 "+ user2)

         conversation.find({ $and : [ { user1: user1 }, { user2: user2 } ] }).toArray(function (err, res) {
          if(err){
              throw err;
          }

          console.log(res) 
              // Emit the messages
          io.emit('RECEIVE_MESSAGE', res);
        })

      });
截图:

聊天截图:


您可以使用
Promise
s

let conversation = db.collection("conversation");
const waitForUser2 = new Promise((resolve, reject) => {
    socket.on("GET_USER", function (data) {
        resolve(data.user2);
    });
});
const waitForUser1 = new Promise((resolve, reject) => {
    socket.on("LOGGEDIN_USER", function (data) {
        resolve(data.user1);
    });
});
Promise.all([
    waitForUser1,
    waitForUser2
]).then(([user1, user2]) => {
    console.log("This is user1 " + user1);
    console.log("This is user2 " + user2);
    conversation.find({
        $and: [
            {user1: user1},
            {user2: user2}
        ]
    }).toArray(function (err, res) {
        if (err) {
            throw err;
        }
        console.log(res);
        // Emit the messages
        io.emit("RECEIVE_MESSAGE", res);
    });
});

尝试将查询更改为对话。查找({user1:user1,user2:user2})。toArray(function(err,res){@DanielPérez)当前答案工作正常。实际上,在我的聊天应用程序中。user1是从url参数接收的,user2仅在某个用户从用户列表中单击用户时设置,所以在这种情况下,查找({})工作正常,但
find({$and:[{user1:user1},{user2:user2}]}
不起作用,因为user2未定义,所以当用户从用户列表中单击用户时(请参见屏幕截图),只有user2被分配,然后查询成功并返回响应。JS的异步行为非常棘手:(@DanielPérez如果用户单击用户列表中的多个用户,即用户Aditya或用户Vinet,则单击Aditya应加载Mike和Aditya之间的聊天。同样,当用户单击Vinet时,应加载Vinet和Mike之间的聊天(注意,Mike已登录用户)。因此,当用户第一次单击时,当前答案有效,但如果单击了user2并为其分配了新值,则当前答案无效working@DanielPérez每次单击userlist中的用户时,为user2分配新值时,它都不起作用。当前答案仅在用户第一次从未定义更改为EIT时起作用r vineet或Aditya(请参见userlist of users的屏幕截图)。当前的答案很好。实际上,在我的聊天应用程序中。user1是从url参数接收的,user2仅在一些用户从用户列表中单击user时设置,因此find({})在本例中工作正常,但
find({$and:[{user1:user1},{user2:user2}]))
不起作用,因为user2未定义,所以当用户从用户列表中单击用户时(请参见屏幕截图)然后只分配user2,然后查询成功并返回响应。您的答案是正确的,但如果用户单击用户列表中的多个用户,即用户Aditya或用户Vinet,则单击Aditya应加载Mike和Aditya之间的聊天。同样,当用户单击Vinet时,应加载Vinet和Mike之间的聊天(注意此处Mike已登录用户)。因此,当用户第一次单击时,您的答案是有效的,但如果用户2被单击并分配了一个新值,则该答案不起作用。当每次单击用户列表中的用户时,为用户2分配新值时,该答案不起作用。当前答案仅在用户从未定义更改为Vinet或Aditya时第一次起作用(请参见用户列表截图)。如果您有其他问题,请询问其他问题