我正在构建一个作为 node 项目开始的应用程序.我能够通过package.json中的脚本运行我的JS,并将东西记录到终端.

我现在正在try 插入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}`));

我的客户.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);
});

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

我假设我需要一些回调函数或一个等待方法(尽管我更喜欢使用Promise),但由于我从外部导入该函数,我不确定如何使用.then()或其他延迟方法来包装它.或者,也许有一种方法可以修改我的retrieveProjectDetails函数.

如果您需要更多信息(html标记、控制台日志(log)等),请拨打电话.

任何帮助都是非常感激的.

推荐答案

try 从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);

    });

});

Javascript相关问答推荐

React中的表格中 Select Radio按钮

HTML/JavaScript函数未执行

reaction如何在不使用符号的情况下允许多行返回?

如何访问Json返回的ASP.NET Core 6中的导航图像属性

模块与独立组件

GrapeJS -如何保存和加载自定义页面

D3 Scale在v6中工作,但在v7中不工作

在grafana情节,避免冲突的情节和传说

编剧如何获得一个div内的所有链接,然后判断每个链接是否都会得到200?

VUE 3捕获错误并呈现另一个组件

Next.js服务器端组件请求,如何发送我的cookie token?

用于在路径之间移动图像的查询

为什么我的自定义元素没有被垃圾回收?

400 bad request error posting through node-fetch

JavaScript不重定向配置的PATH

钛中的onClick事件需要在两次点击之间等待几秒钟

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

Phaser3 preFX addGlow不支持zoom

JavaScript -复制到剪贴板在Windows计算机上无效

使用可配置项目创建网格