我在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"]
);
问题是它不会取消请求。我阅读了Chrome文档和Firefox文档以及Firefox,它说它基于Chrome的API并且可以返回承诺以异步方式处理请求。
但是,除非我让它同步,否则它无法取消(IE:如果我只返回{cancel : true}
而不是承诺,它就可以了。)
我做错了什么或Chrome和Firefox仅支持同步请求处理吗?
答案 0 :(得分:2)
Chrome documentation向我朗读,好像你必须使用同步阻止响应来取消请求,这也是我的经验。
强调我的:
如果可选的opt_extraInfoSpec数组包含字符串'blocking' (仅允许特定事件),处理回调函数 同步。这意味着请求被阻止,直到 回调函数返回。 在这种情况下,回调可以返回一个 webRequest.BlockingResponse确定了进一步的生命周期 请求。根据上下文,此响应允许取消 或重定向请求(onBeforeRequest),取消请求或 修改标题(onBeforeSendHeaders,onHeadersReceived)和 取消请求或提供身份验证凭据 (onAuthRequired)。
我的阅读是,如果您的事件处理程序是同步的,您只能影响请求生命周期(如取消它)。
此外,文档也没有提及任何关于直接支持Promise而不是BlockingResponse的内容,所以它似乎是特定于Firefox的功能。