0

私の拡張機能のコンテンツスクリプトでは、次のようにbackground.jsからデータをリクエストします。

fireOnNewTopic ();  // Initial run on cold start or full reload.

window.addEventListener ("hashchange", fireOnNewTopic,  false);

function fireOnNewTopic () {
/*-- For the pages we want, location.hash will contain values
    like: "#!newtopic/{group title}"
*/
  if (location.hash) {
    var locHashParts    = location.hash.split ('/');
    if (locHashParts.length > 1  &&  locHashParts[0] == '#!newtopic') {
        var subjectStr  = '';
        var bodyStr  = '';
        switch (locHashParts[1]) {
            case 'opencomments-site-discussions':
            chrome.extension.sendMessage({name:"domain"},
                function(response)
                {
                subjectStr = response.domain;   
                });
            chrome.extension.sendMessage({name:"url"},
                function(response)
                {
                bodyStr = "URL of last page visited: " +                        response.url;   
                });
                break;
            default:
                break;
        }

        if (subjectStr && bodyStr) {
            runPayloadCode (subjectStr, bodyStr);
        }
    }
  }
}

残念ながら、sendMessage()はコールバックと非同期で実行されるため、コードがrunPayloadCode()に到達した時点では、background.jsのコードが完了していないため、subjectStrとbodyStrはnullのままです。runPayloadCode()が呼び出されるまでにsubjectStrとbodyStrが入力されるように、コードを同期するための最良の方法は何ですか?

4

2 に答える 2

1

2つのリクエストを1つに結合することについてSudarshanが言ったことを詳しく説明するために(申し訳ありませんが、コードが必要なので、コメントすることはできませんでした)、ここでできることは次のとおりです...
送信

chrome.extension.sendMessage({url: true, domain:true}, function(response) {
  console.debug('The url is "'+response.url+'" and the domain is"'+response.domain+'"');
  if (repsone.url && response.domain) {
            runPayloadCode (subjectStr, "URL of last page visited: " + response.domain);
        }
});

または、何らかの理由でケースのようにしたい場合は、これがあなたが望むようなものかもしれません...

    if(location.hash) {
        var locHashParts = location.hash.split('/');
        if(locHashParts.length > 1 && locHashParts[0] == '#!newtopic') {
            var subjectStr = '';
            var bodyStr = '';
            var request = {};
            switch(locHashParts[1]) {
            case 'opencomments-site-discussions':

                request = {
                    url: true,
                    domain: true
                }
                break;
            default:
                break;
            }

            chrome.extension.sendMessage(request, function(response) {
                console.debug('The url is "' + response.url + '" and the domain is"' + response.domain + '"');
                if(repsone.url && response.domain) {
                    runPayloadCode(subjectStr, "URL of last page visited: " + response.domain);
                }
            });

        }
    }
}  

聞く

chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
    var response = {};
    if(request.url) {
        response.url = "someURL";
    }
    if(request.domain) {
        response.domain = "someDomain";
    }
    sendResponse(response);
});
于 2012-12-01T18:29:59.043 に答える
0

次のコードを試すことができます。

case 'opencomments-site-discussions':
chrome.extension.sendMessage({
    name: "domain"
},

function (response) {
    subjectStr = response.domain;
  if(subjectStr){
    chrome.extension.sendMessage({
        name: "url"
    },

    function (response) {
        bodyStr = "URL of last page visited: " + response.url;
        if (bodyStr) {
            runPayloadCode(subjectStr, bodyStr);
        }
    });
}
});

ただし、両方のメッセージを1つのメッセージにマージして(私はそれらが独立していると見なすため)、複数のネストを排除することはできませんchrome.extension.sendMessage({name: "url"})chrome.extension.sendMessage({name: "domain"})

于 2012-12-01T17:17:25.347 に答える