首页 > 解决方案 > 如何从数据库中异步获取数据?

问题描述

我在两个用户之间创建了一个聊天应用程序。加载客户端时,会为 user1 分配一个值,而 user2 在启动时未定义。当用户单击屏幕截图左侧的用户列表按钮时,将分配 user2。所以现在我有 user1 和 user2 所以现在我想获取 user1 和 user2 之间的所有数据,但我得到一个空数组。conversation.find({ $and : [ { user1: user1 }, { user2: user2 } ] })click 后设置 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);
        })

      });

截屏:

在此处输入图像描述

聊天截图:

在此处输入图像描述

标签: javascriptnode.jsmongodb

解决方案


您可以使用Promises

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

推荐阅读