Firefox扩展:在browser.webRequest.onBeforeRequest.addListener中使用promise

时间:2018-12-18 07:19:04

标签: javascript firefox-addon extension-methods

我正在使用Firefox扩展,并使用browser.webRequest.onBeforeRequest.addListener。

我需要重定向或释放webRequest,直到从处理程序内进行的调用中获取信息为止。

我曾经使用同步ajax,但是当网络状况不佳时,该页面被阻塞了太长时间。如果请求时间超过5秒,我想取消ajax请求。但是似乎无法在同步呼叫上设置超时。

这几天,我尝试使用异步ajax并使用https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onBeforeRequest中提供的方法(返回新的Promise)。我尝试了几天,但失败了。

我的代码:

var LOOKUP_URL = "https://a.b.c.com/";
var urlLookup = new UrlLookup(LOOKUP_URL);
var blockList = [];

browser.webRequest.onBeforeRequest.addListener(redirectAsync, {urls: ['<all_urls>']},, ["blocking"]);

function redirectAsync(details) {
    var url = details.url;
    return new Promise(function(resolve,reject){

        var urlLookupResult = urlLookup.check(url, LookupComplete);

        if(urlLookupResult.result){
            var redirectUrl = urlLookupResult.url;
            resolve({redirectUrl})
        }
    })
}

function LookupComplete(url, data, error){
    if(data.result){
        blockList.push(url);
        localStorage.setItem("blockList",JSON.stringify(blockList));

        return {
                result: true,
                url: "https://aaa.bbb.com/alerts.php?url=" + url;
            }
    }else {
        return null
    }
}
urlLookup.js中的

代码:

function UrlLookup(domain) {

    function check(url, callback) {
        var data;
        var http_request = new XMLHttpRequest();
        var timeId = window.setTimeout(function(){
            http_request.abort();
        },5000)
        http_request.open("GET", domain + 'url='+url);
        try {
            http_request.send();
            http_request.onreadystatechange = function(){
                if(http_request.readyState == 4 && http_request.status == 200){
                    window.clearTimeout(timeId);
                    data = JSON.parse(http_request.response);
                    return callback(url, data);
                }
            }
        } catch (e){
            return callback(url, null, "Error");
        }
    };

    return {
        check: check
    };
}

我应该如何修改它?

0 个答案:

没有答案