我是socket.io的新手。我在处理socket.on的异步时遇到了一些麻烦,我想知道是否有解决办法或某种方法来为socket.on创建整个功能块
我正在开发一个从MongoDB获取数据的应用程序接口。并在react前端调用这些API。我最近正在尝试做以下事情:
// frontend (onClick function)
const handleOnClick = () => {
const data = api();
// do the work
}
// API
const api = () => {
var value;
// ask for data
socket.emit("ask-for-data");
// get respond from database
socket.on("get-response", (data) => {
value = data; //<- value is correct right here
});
//respond from API
return { value }; //<- value is undefined
我想让整个函数返回通过socket.io获取的数据。但是,我尝试将async-await添加到API函数中,结果没有任何用处。
// frontend (onClick function)
const handleOnClick = async () => {
const data = await api();
// do the work
}
// API
const api = async () => {
var value;
// ask for data
socket.emit("ask-for-data");
// get respond from database
await socket.on("get-response", (data) => {
value = data; //<- value is correct right here
});
//respond from API
return { value }; //<- value is undefined
那么,有没有办法确保我可以返回从socket.on获得的值呢?我知道socket.on是作为异步函数处理的,并且API函数将在套接字io完成其任务之前返回。BTW、API和handleOnClick存储在不同的js文件中。耽误您时间,实在对不起!
发布于 2021-01-16 18:28:26
socket.on()
不是异步的:这意味着执行流将在不等待任何get-response
事件的情况下继续执行,并且您的value
变量将为undefined
。
尝试将您的api
函数包装在一个Promise
中,它在您使用get-response
时会解析,如下所示:
const api = function() {
return new Promise(function(resolve, reject) {
socket.emit("ask-for-data");
socket.on("get-response", (data) => {
resolve(data);
})
});
}
然后
const data = await api();
https://stackoverflow.com/questions/65748063
复制相似问题