首页 > 解决方案 > 如何立即收听来自客户端(vue)的服务器(快递)发送的事件

问题描述

我正在尝试收听来自我的 vue js 客户端的 Express 服务器发送的事件。我想在它发出后立即收听。但直到整个过程完成后才会这样做。

我的 Express 控制器代码是:

exports.getFruits = (req, res, next) => {
   const fruits = ["mango", "jackfruit", "banana", ...........];
   for(let i = 0; i < fruits.length; i++){
      res.emit('fruit', fruits[i]);
   }
};

从我的 vue 客户端,我提出了这个请求

axios.get("localhost:3000/get-fruits")
.then(res => {
   console.log(res.data);
})
.catch(err => {
   console.log(err);
});

我怎样才能在这里收听服务器立即发送的 Emit?任何帮助将不胜感激。

标签: javascriptnode.jsvue.js

解决方案


这是node.js任何同步循环的预期行为将始终阻塞线程,并且在循环完成后它将处理其他事件。

请参阅事件循环以获取更多信息,但要了解重点:

有5个阶段

   ┌───────────────────────────┐
┌─>│           timers          │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │     pending callbacks     │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
│  │       idle, prepare       │
│  └─────────────┬─────────────┘      ┌───────────────┐
│  ┌─────────────┴─────────────┐      │   incoming:   │
│  │           poll            │&lt;─────┤  connections, │
│  └─────────────┬─────────────┘      │   data, etc.  │
│  ┌─────────────┴─────────────┐      └───────────────┘
│  │           check           │
│  └─────────────┬─────────────┘
│  ┌─────────────┴─────────────┐
└──┤      close callbacks      │
   └───────────────────────────┘

现在poll是执行同步代码pending callbacks的地方,也是处理回调的地方。因此,当阶段移动到poll它时,已经检查了所有回调和 async/libuv 的东西。所以你for loop在这里,现在直到它完全执行它才会进入事件循环的下一个阶段并返回到该pending callbacks阶段。

因此,循环完成后,它将进入其他阶段,并会看到那里有多个 unservices 回调(您的事件),它将一一处理。希望你理解这个概念。

您可以做的一件事是,您可以分叉另一个进程来服务您的事件并发送fruits使用process.send而不是事件。然后该进程将立即为事件处理程序提供服务。


推荐阅读