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