【问题标题】:How to make chrome.webRequest wait for results of XMLHttpRequest();如何让 chrome.webRequest 等待 XMLHttpRequest() 的结果;
【发布时间】:2018-08-17 09:33:01
【问题描述】:

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

来自 Chrome 开发者文档,他们提供了following basic example for blocking

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

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


例如,这将起作用:

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

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

但是如果我使returnTrue() async 监听器不再阻塞,页面就会加载。例如,

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

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

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


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

【问题讨论】:

  • 我不认为webRequest.onBeforeRequest 可以处理由侦听器返回的承诺 - 至少,不是在 chrome 中 - Chrome 的(糟糕的)文档中没有关于此的任何内容提及承诺
  • Chrome API 是基于回调的,这在文档中所有方法的描述中都有明确说明,因此 async/await 将不起作用,因为它是基于 Promise 的。因此唯一可用的方法是同步 XHR。您可以忽略弃用警告。您还可以添加超时以确保您的后台页面不会被阻止超过指定的时间。

标签: javascript google-chrome-extension xmlhttprequest


【解决方案1】:

尚不支持异步。

一种折衷方案是缓存您要修改的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    相关资源
    最近更新 更多