Javascript 有响应的CustomEvent,这可能吗?

Javascript 有响应的CustomEvent,这可能吗?,javascript,events,Javascript,Events,我正在尝试将CustomEvent合并到我的工作流中。 但我需要这个事件以两种方式进行通信:一个脚本将事件发送到文档,它应该响应同一个启动器 我尝试了以下几点: ev = new CustomEvent('StorageRequest', { detail: { space: theSpace, method: theMethod, arguments: args } }) document.dispatchEvent(ev) 我的听众是这样的: documen

我正在尝试将CustomEvent合并到我的工作流中。 但我需要这个事件以两种方式进行通信:一个脚本将事件发送到文档,它应该响应同一个启动器

我尝试了以下几点:

ev = new CustomEvent('StorageRequest', {
  detail: {
    space: theSpace,
    method: theMethod,
    arguments: args
  }
})
document.dispatchEvent(ev)
我的听众是这样的:

document.addEventListener('StorageRequest', (e) => {
  console.debug('Sending StorageRequest', e)
  // do something, then answer back with response
})
实现这一目标的方法是什么

我曾尝试使用承诺并使用resolve/reject发送响应,但在事件中传递函数似乎会破坏
细节,如果我尝试这样做,结果是空的:

return new Promise((resolve, reject) => {
  ev = new CustomEvent('StorageRequest', {
    detail: {
      space: theSpace,
      method: theMethod,
      arguments: args,
      resolve, reject
    }
  })
  document.dispatchEvent(ev)
})
注意事项: 我希望避免“一般”地将响应发送回文档。我希望请求和响应是完全有意的,并在代码中正确处理
我没有附加元素,因此使用
e.target
中的元素不是一个选项(除非我可以用它做其他事情)

您不能在DOM事件中“响应”——它们只是向上传播DOM树,直到它到达顶层

承诺可能有效,设置正确,但您只能响应一次。一旦承诺被解决/拒绝,您就无法再次解决或拒绝它,它将忽略后续的解决/拒绝调用

作为替代方案,您可以设置2个单独的事件,并响应第一个事件,该事件应实现您尝试执行的操作:

sReqEvent=new CustomEvent('StorageRequest'{
详情:{
空间:空间,
方法:方法:,
参数:args
});
调试('Sending StorageRequest');
文件。调度事件(sReqEvent);
听众:

document.addEventListener('StorageRequest', (e) => {
    // do something, then answer back with response
    var sRespEvent = new CustomEvent('StorageResponse', e.data);
    console.debug('Sending StorageResponse', e.data);
    document.dispatchEvent(sRespEvent);
});

document.addEventListener('StorageResponse', (e) => {
    // This is my response
});
假设这是不必要的,您可以只使用从StorageRequest侦听器中调用的“StorageResponse”函数



另一种选择是使用
window.postMessage
,但这更需要使用单独的前后请求进行设置,IE9将只支持传递的字符串(如果你想发送除字符串以外的任何东西,你需要在IE9中对包进行JSON编码/解码,但如果你在所有浏览器中都这样做作为一个全局解决方案,那么速度会慢一些).

感谢您的详细回复!我考虑过使用这种
StorageResponse
模式,但我不确定如何处理多个实例-您知道如何确保正确的响应转到正确的响应回调吗?(假设他们只需要将承诺返回到正确的链)我不确定您所说的“正确响应”——有多个并发调用——是什么意思?如果是这种情况,您需要在数据中传递某种形式的ID(第二个参数传递给
new CustomEvent('StorageRequest',…)
),并在
StorageResponse
侦听器中检查该ID。