Javascript 在chrome/firefox扩展API中,如何在不发送新消息的情况下从端口获得链接响应?

Javascript 在chrome/firefox扩展API中,如何在不发送新消息的情况下从端口获得链接响应?,javascript,google-chrome-extension,firefox-addon-webextensions,Javascript,Google Chrome Extension,Firefox Addon Webextensions,对于一次性消息,发送方发送消息,接收方通过回调接收响应 // Sender chrome.runtime.sendMessage({greeting: "hello"}, function(response) { console.log(response.farewell); }); 对于端口通信,API文档和示例如下:发送方发送消息,接收方发送新消息,但不作为响应 比如说 // Sender port?.postMessage({greeting: "he

对于一次性消息,发送方发送消息,接收方通过回调接收响应

// Sender
chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});

对于端口通信,API文档和示例如下:发送方发送消息,接收方发送新消息,但不作为响应

比如说

// Sender
port?.postMessage({greeting: "hello"});

port.onMessage.addListener(function(msg) {
  if (msg.farewell)
      console.log("Farewell is", msg.farewell)
});

无论如何,是否可以使用端口通信来模拟一次性消息通信,该端口通信可以作为回调或承诺返回响应,以便我可以链接逻辑。链接响应,特别是使用浏览器polyfil的async Wait,使代码逻辑流更自然。

端口通信没有回调响应。 但是,您可以使用等待特定消息的异步包装器进行模拟。 这不仅会捕获接收者的回复,还会捕获匹配的所有msg.subject。 但是,有了它,您仍然可以在一个函数中执行所有逻辑,而不是在侦听器中执行零碎的逻辑

async function waitForResponse(port, subject) {
  return new Promise((resolve) => {
    const callback = (msg) => {
      if (msg.subject === subject) {
        port.onMessage.removeListener(callback);
        resolve(msg);
      }
    };
    port.onMessage.addListener(callback);
  });
}
// Receiver
port.onMessage.addListener(function(msg) {
  if (msg.greeting == "hello")
    port.postMessage({farewell: "goodbye"});
});
async function waitForResponse(port, subject) {
  return new Promise((resolve) => {
    const callback = (msg) => {
      if (msg.subject === subject) {
        port.onMessage.removeListener(callback);
        resolve(msg);
      }
    };
    port.onMessage.addListener(callback);
  });
}