javascript - 如何让 chrome.webRequest 等待 XMLHttpRequest(); 的结果

标签 javascript google-chrome-extension xmlhttprequest

我正在开发一个 Chrome 扩展程序,我想在其中阻止基于外部查找的页面加载(例如,根据用户在输入栏中输入的 URL 检查垃圾邮件评级或其他服务)。

在 Chrome 开发者文档中,他们提供了 following basic example for blocking :

chrome.webRequest.onBeforeRequest.addListener(
    function(details) { return {cancel: true}; },
    {urls: ["*://www.evil.com/*"]},
    ["blocking"]);

我遇到的问题是试图找出使用回调、 promise 或异步/等待的正确方法,以便我可以确定是否要返回 true 并阻止网页加载。


例如,这将起作用:

function returnTrue(){
  return {cancel: true};
}

chrome.webRequest.onBeforeRequest.addListener(
  returnTrue,
  {
    urls: ["<all_urls>"],
    types: ["main_frame"]
  },
  ["blocking"]);

但是如果我使 returnTrue() 异步,则监听器不再阻塞,并且页面加载。例如,

async function returnTrue(){
  return {cancel: true};
}

在我的真实函数中,我尝试对包装的 promise 的结果使用 await XMLHttpRequest()。在此之前,我尝试通过将最后一个参数设置为 false 来在调用 XMLHttpRequest().open() 时使其同步。这会导致同步执行,但其已弃用的功能会导致一些其他奇怪的问题,导致 ,send() 因错误而失败。因此,我想避免强制 .open() 同步。

我还尝试将 async 关键字放在 chrome.webRequest.onBeforeRequest... 之前,但这也不起作用。


如何确保我强制 Chrome 插件等到我调用远程服务并在它执行之前做出决定。由于这是阻塞加载,所以它实际上应该都是同步逻辑,或者至少在做出阻塞决定之前等待。

最佳答案

暂不支持异步。

一个折衷方案是对要修改的内容进行缓存。

关于javascript - 如何让 chrome.webRequest 等待 XMLHttpRequest(); 的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183132/

相关文章:

javascript : how to send request in restful

javascript - 如何忽略 XmlHttpRequest 中的自签名证书

xmlhttprequest - 使用 XMLHttpRequest() 发送文件到 Tika 服务器

javascript:将参数传递/接受给 func

javascript - BrowserAction.onClicked 等待 iframe 加载

javascript - 如何使用 Chrome 扩展禁用 facebook 热键?

javascript - 如何默认在新标签页中打开 chrome-extension

javascript - 获取已定义坐标的图层和要素

javascript - 创建仅存在于形状内的网格

Javascript 多图像通过按钮点击进行更改