簡體   English   中英

如何將js函數從異步調用轉換為回調調用

[英]How to turn js functions from asynchronious calling to callback calling

我正在嘗試制作我的第一個Google Chrome擴展程序。 此擴展名必須攔截對mysite.com的請求,並將用戶重定向到站點鏡像之一(例如,mymirror.com)。 從我的API服務器(例如api.service.com)獲取的第一個被攔截請求的實際鏡像擴展的URL,並將其存儲到Cookie以供下一個請求。

manifest.json

{
    "name": "InterceptMySite",
    "version": "0.1",
    "description": "My first Chrome extension",
    "permissions": ["webRequest", "webRequestBlocking", "cookies",
                    "*://mysite.com/*", "*://api.service.com/*"],
    "background": {
        "scripts": ["background.js"]
    },

    "manifest_version": 2
}

background.js

function setMirrorUrl(callback) {
        var req = new XMLHttpRequest();
        req.open('GET', 'http://api.service.com', false); // sync request
        req.send(null);
        req.onload = function() {
            callback(this.getResponseHeader('Mirror-Url'));
        }
    }
    function getMirrorUrl(callback) {
        chrome.cookies.get({url:'http://api.service.com',name:'mirror_url'}, function(cookie) {
            if ( ! cookie)
                return setMirrorUrl(callback);
            else
                return callback(cookie.value);
        });
    }
    chrome.webRequest.onBeforeRequest.addListener(
        function(info) {
            if(info.url.indexOf('api.service.com') != -1)
                return {cancel:false};

            getMirrorUrl(function(mirror_url){

                return {redirectUrl: info.url.replace(/mysite.com/i, mirror_url)};

            });

        },
        // filters
        {
            urls: [
                "*://mysite.com/*",
                "*://api.service.com/*"
            ]
        },
        // extraInfoSpec
        ["blocking"]
    );

除了一件事情之外,所有方法都工作正常: getMirrorUrl()異步調用。 因此, onBeforeRequest事件偵聽器在getMirrorUrl()完成之前完成。 另外,getMirrorUrl必須以某種方式將結果傳遞給onBeforeRequest偵聽器。

我知道必須將其重寫為回調樣式,但我不知道如何。

您正在執行的回調樣式! 您需要一個cookie,並通過回調異步獲取它。

您可以同步進行API調用(盡管這很丑陋),但是cookie“ get”操作必須是異步的。 因此,我認為您需要預先預加載鏡像URL(例如,一旦頁面加載完成),然后在單擊鏈接時檢索相應的URL。

我嘗試的另一種方法是將redirectUrl設置為當前頁面,異步加載鏡像URL,並在加載頁面后立即觸發頁面更改(我不確定,我從未從擴展API進行過更改) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM