NodeJS socket.io从API请求信息,但在向客户端发送数据之前等待响应

n6lpvg4x  于 2023-11-17  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我正在构建一个应用程序,它最初是一个节点项目。我可以通过package.json中的脚本运行我的JS,并将内容记录到终端。
我现在尝试插入sockets.io来发送数据到客户端。
我希望只有在API调用完成后才向客户端发出消息(我正在从另一个文件导入此消息)。
这是我的server.js

import { retrieveProjectDetails } from '../index.js';

io.on('connection', (socket) => {
  console.log('server: a user connected');

  socket.on('getProjectDetails', (data) => {
    console.log('server: getProjectDetails: ' + data);

    io.emit('sendProjectDetails', (responseData) => {
      responseData = retrieveProjectDetails(); // This is emitting before the API call has been received. 
      console.log(`server: data: ${responseData}`);
    });
  });

  socket.on('disconnect', () => {
    console.log('server: user disconnected');
  });

});

app.listen(PORT, () => console.log(`Listening on: ${PORT}`));

字符串
我的client.js

const getProjectDetails = document.querySelector('.getProjectDetails');
const details = document.querySelector('.details');

getProjectDetails.addEventListener('click', (event) => {
  const target = new Date();
  socket.emit('getProjectDetails', target);
});

socket.on('sendProjectDetails', (data) => {
  details.textContent = JSON.stringify('received' + data, null, 4);
  console.log('client: sendProjectDetails was sent from the server');
  console.log(data);
});


index.js(在根目录下)

const getProject = () => {
  return apiRoot.get().execute();
};

// Retrieve Project information and output the result to the log
const retrieveProjectDetails = (data) => {
  getProject()
    .then(response => {
      data = response;
      console.log(data);
      return data;
    })
    .catch(console.error);
}


我假设我需要一些回调函数,或者一个await方法(尽管我更喜欢使用promise),但是由于我从外部导入函数,我不确定如何使用.then()或其他延迟方法 Package 它。或者也许有一种方法可以修改我的retrieveProjectDetails函数。
如果你需要更多的信息(html标记,控制台日志等)只是喊。
任何帮助都非常感谢。

xxe27gdn

xxe27gdn1#

尝试从retrieveProjectDetails返回getProject,这样它就返回一个promise:

const retrieveProjectDetails = (data) => {
    return getProject()
        .then(response => {
        //...

字符串
然后先调用它,然后从回调中发出数据:

socket.on('getProjectDetails', (data) => {

    console.log('server: getProjectDetails: ' + data);

    retrieveProjectDetails(data).then(responseData => {

        console.log(`server: data: ${responseData}`);

        io.emit('sendProjectDetails', responseData);

    });

});

相关问题