曲阿子期 2021-10-29 17:09 采纳率: 0%
浏览 14

Promise内的自定义事件为什么不响应?

做websocket应用时有这样一种需求:

ws.onmessage = function(e) {
}

这个要响应做普通异步数据处理,但偶尔有同步处理的需求,于是我在ws.onmessage里自定义了一个事件:

ws.onmessage = function(e) {
//...
myData = procData(e.data);//处理我想要的数据

//以下发送自定义消息
var evt = new CustomEvent('Message', {
   detail: {data: myData},
 });
 window.dispatchEvent(evt);

}

 

 

var onMessage;

window.addEventListener("Message",onMessage,false);

//直接下面这样是有响应的
onMessage = function(e) {
   console.log(e.detail.data);
}

 

//但如果放到Promise内就没响应了,更奇怪的是ws.onmessage这个消息就会有响应
function ReceiveMessage() {
   return new Promise((resolve) => {
      onMessage = function(e) {
         console.log(e.detail.data);
         resolve(e.detail.data);
      }
      //ws.onmessage = function(e) {
      // 如果用这一段代码就有响应
      //}
   });
}

async function func1() {
   //...
   var ret = await ReceiveMessage();
   return (ret);
}

我是业余玩玩JS的,并不怎么会,很多代码都是网上找来的,谁能告诉我这是为什么?
我的目的就是要func1等到WS收到数据后才能返回,否则达到设定时间后超时返回

  • 写回答

1条回答 默认 最新

  • 流比 2023-01-30 17:29
    关注

    可能是因为函数 onMessage 的定义在 ReceiveMessage 函数内部,它是一个局部变量,因此不能被全局 window 访问。 可以将 onMessage 定义在全局作用域下,这样在任何地方都可以访问到。 同时,使用箭头函数可以保持环境的闭包。

    
    var onMessage = (e) => {
    console.log(e.detail.data);
    };
    
    window.addEventListener("Message", onMessage, false);
    
    function ReceiveMessage() {
    return new Promise((resolve) => {
    resolve(e.detail.data);
    });
    }
    
    async function func1() {
    // ...
    var ret = await ReceiveMessage();
    return ret;
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月29日

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?