BrowserExtension webRequest.onBeforeRequest 返回承诺

Bra*_*don 4 javascript google-chrome-extension firefox-addon-webextensions

我在 Chrome 和 FireFox 扩展程序中有以下内容:

function webListener(requestDetails) {
    var asyncCancel = new Promise((resolve, reject) => {
        resolve({ cancel : true });
    });
    return asyncCancel;
}

chrome.webRequest.onBeforeRequest.addListener(
    webListener, {
        urls: ["<all_urls>"],
        types: ["script"]
    }, ["blocking", "requestBody"]
);
Run Code Online (Sandbox Code Playgroud)

问题是它不会取消请求。我阅读了 Chrome 文档和 Firefox 文档,对于 Firefox,它说它基于 Chrome 的 API,并且可以返回异步处理请求的承诺。

但是,除非我使其同步,否则它无法取消(即:如果我只是返回而{cancel : true}不是承诺,它就会起作用)。

我是否做错了什么,或者 Chrome 和 Firefox 只支持同步请求处理?

Kar*_*eid 5

Chrome文档对我来说好像必须使用同步、阻塞响应来取消请求,这也是我的经验。

强调我的:

如果可选的 opt_extraInfoSpec 数组包含字符串“blocking”(仅允许特定事件),则同步处理回调函数。这意味着请求将被阻止,直到回调函数返回。在这种情况下,回调可以返回一个 webRequest.BlockingResponse 来确定请求的进一步生命周期。根据上下文,此响应允许取消或重定向请求(onBeforeRequest)、取消请求或修改标头 (onBeforeSendHeaders、onHeadersReceived) 以及取消请求或提供身份验证凭据 (onAuthRequired)。

我的理解是,如果您的事件处理程序是同步的,您只能影响请求的生命周期(例如取消它)。

此外,文档也没有提到任何有关直接支持 Promise 而不是 BlockingResponse 的内容,因此这似乎是 Firefox 特定的功能。

  • Chrome API 不在任何地方使用 Promise。另请参阅 MDN 上的 [Chrome 不兼容性](https://developer.mozilla.org/Add-ons/WebExtensions/Chrome_incompatibilities) 文章。 (2认同)