JavaScript-等待异步功能完成

时间:2018-06-25 05:07:10

标签: javascript asynchronous google-chrome-extension

在我的Chrome扩展程序中,我检查了特定域下的每个Web请求。如果该URL符合特定条件,并且,并且存在一个与另一个URL匹配的现有打开标签,则我想返回{cancel: true},这意味着该请求已被阻止。

所以我的代码以这种方式工作:如果请求的URL符合我的条件,请检查所有打开的选项卡。如果其中一个打开的选项卡符合我的(第二个)条件,我想从我的初始(外部)功能返回{cancel: true}

问题:在检查所有选项卡(=在执行所有return循环之前)之前,外部函数的forEach会触发,因此它总是返回{cancel: false}

[我知道与此相关的问题很多,其中一个主要的解决方案包括回调函数,但特别是在我的情况下,我尚未成功完成这项工作。]

代码:

function onBeforeRequestHandler (details) {
    var cancel = false;
    var url = details.url;
    // condition 1
    if (url.indexOf("condition_1") > -1){

        // check all open windows/tabs
        chrome.windows.getAll({populate:true}, function(windows){
            windows.forEach(function(single_window){
                single_window.tabs.forEach(function(tab){
                    // condition 2
                    if (tab.url.indexOf("condition_2") > -1){
                        cancel = true;
                        // this is less important - updating the tab works
                        chrome.tabs.update(tab.id, {url: url});
                    }
                });
            });
        });
        // always getting cancel = false here because it fires too quickly
        return {cancel: cancel};
    }
    else
        return {cancel: false};
}

chrome.webRequest.onBeforeRequest.addListener(onBeforeRequestHandler, {urls: ["some_domain"]}, ["blocking"]);

1 个答案:

答案 0 :(得分:1)

当前,您无法基于Google Chrome中的异步功能取消请求。

在Firefox中,它已经支持Promise的异步功能,您可以像以下代码一样实现该功能。

function onBeforeRequestHandler (details) {
   var cancel = false;
   var url = details.url;
   // condition 1
   if (url.indexOf("condition_1") > -1){
       // check all open windows/tabs
       // return Promise which will be resolved after populate windows/tabs
       return browser.windows.getAll({populate:true})
           .then(function(windows) {
               windows.forEach(function(single_window) {
                   single_window.tabs.forEach(function(tab) {
                   // condition 2
                   if (tab.url.indexOf("condition_2") > -1) {
                       // this is less important - updating the tab works
                       browser.tabs.update(tab.id, {url: url});
                       return { cancel: true }
                   }
               });
           });
         })
   }
   else
       return {cancel: false};
}

历史/参考

根据MDN中的webRequest.onBeforeRequest

  

从Firefox 52开始,侦听器可以返回一个Promise,该Promise由BlockingResponse解决,而不是返回BlockingResponse。这使侦听器能够异步处理请求。   Using AWS Lambda Functions with Amazon Connect

已经在Chrome上报告了类似Firefox的功能请求,但该票证尚未关闭。 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest/onBeforeRequest