Javascript BrowserExtension webRequest.onBeforeRequest返回承诺

Javascript BrowserExtension webRequest.onBeforeRequest返回承诺,javascript,google-chrome-extension,firefox-addon-webextensions,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( web

我在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"]
);
函数webListener(请求详细信息){
var asyncCancel=新承诺((解决、拒绝)=>{
解析({cancel:true});
});
返回异步取消;
}
chrome.webRequest.onBeforeRequest.addListener(
webListener{
URL:[“”],
类型:[“脚本”]
},[“阻止”,“请求主体”]
);
问题是它不会取消请求。我读过Chrome文档和Firefox文档,Firefox文档说它基于Chrome的API,可以返回异步处理请求的承诺

但是,除非我使其同步,否则它将无法取消(即:如果我只返回
{cancel:true}
而不是promise,它将工作)

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

对我来说,就像你必须使用同步阻塞响应来取消请求一样,这也是我的经验

重点地雷:

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

我的理解是,如果事件处理程序是同步的,则只能影响请求生存期(如取消请求)


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

docs link?…@mehulmpt。上面的部分说:
从Firefox 52开始,监听器可以返回一个承诺,而不是返回BlockingResponse,这个承诺是通过BlockingResponse解决的。这使侦听器能够异步处理请求。
我使用的是Firefox Quantum,它是最新推出的浏览器和最新的Chrome浏览器。我认为您的代码无法正常工作是有道理的。文档列出了承诺重定向请求的示例。如果句柄是异步的,浏览器不会停止请求。您只能从返回的承诺中重定向,而不能取消它。此外,Chrome文档本身没有提到任何关于支持承诺的内容,而不是直接的
BlockingResponse
,因此我认为它不会起作用。我知道Firefox文档说它们是基于Chrome的,但那只是最初的设计,可能存在一些分歧。@mehulmpt;嗯,我假设,因为它说
异步处理请求
,这意味着取消和重定向。如果我在Chrome和Firefox的承诺中加入
控制台.log
,它会被打印出来,除了实际的取消之外,一切都正常。我想你是对的,它必须是同步的。ChromeAPI在任何地方都不使用Promise。另请参阅关于MDN的文章。
这似乎是Firefox特有的功能。
对于Firefox,我更倾向于说它更多的是未知的代码外观。