1

いつものように、私はこれをかなりグーグルで検索し、Message Passing API を読みましたが、やはり StackOverflow の優秀な人に頼らなければなりませんでした。

私の質問は次のとおりです: Google Chrome 拡張機能のバックグラウンド ページとコンテンツ スクリプトの間でメッセージを渡す場合、非同期にする方法はありますか。つまり、メッセージが正常に渡されたと検出されるまで JavaScript を遅らせる方法はありますか?

localStorageメッセージパッシング関数が渡されたデータを利用した直後に関数があります。最初の実行では、データが十分に速く渡されないため、スクリプトは常にエラーになります。

現在、私はこれを回避してsetTimeout(nextFunction, 250);いますが、渡される値の量とサイズは常に変化し、値を渡すのに必要な時間を知る方法がないため、これはエレガントで実用的なソリューションとは言えません。さらに、経過時間はブラウザのバージョンとユーザーのシステムに関連していると思います。

つまり、動的にする必要があります。

私は次のようなことを検討しました

function passMessages(){
    chrome.extension.sendRequest({method: "methodName"}, function(response) {
        localStorage["lsName"] = response.data;
    });

    checkPassedMessages();
}

function checkPassedMessages(){
    if (!localStorage["lsName"]){
        setTimeout(checkPassedMessages, 100); //Recheck until data exists
    } else {
         continueOn();
    }
}

しかし、私はかなりの量のデータ (少なくとも 20 個の値) を渡す必要があり、率直に言って、それは実用的で!localStorage["lsName1"] && !localStorage["lsName2"]はありません。さらに、それが機能するかどうかもわかりません。

誰にもアイデアはありますか?

ありがとう

更新:残念ながら、まだ答えはありません。誰でも何か助けを提供できますか?:/

4

2 に答える 2

0

私はあなたの質問を間違って解釈しているかどうかわかりません。私が理解している限り、あなたは拡張ページからコンテンツスクリプトにリクエストを送信しています。コンテンツハンドラーのリクエストハンドラーは、渡されたメッセージに対して何らかの操作を実行します。その後、拡張機能ページでコントロールを戻す必要があります。これが必要な場合は、Google拡張機能のドキュメントにすべてが含まれています。次のコードは機能します

//Passing the message
function passMessages(){
  chrome.extension.sendRequest({method: "methodName"}, function(response) {
    //callback function that will be called from the receiving end

    continueOn();
  });
}

//Recieving the message
chrome.extension.onRequest.addListener(
  function(request, sender, sendResponse) {
     //Do the required operation with the message passed and call sendResponse

     sendResponse();
});
于 2012-05-09T09:34:05.673 に答える
0

収集された情報の処理を開始する前に、何らかの「go」メッセージが続くのを待っている間に、渡された情報を収集することによって、この問題の一般的なケース (つまり、異なる実行スレッド間で通信しているプラ​​ットフォーム) を解決できます。同じ考え方を使用して、送信者に完全な返信を待たせることができます。

もちろん、特定のプラットフォームがこれを行うためのツールを提供している可能性があります。そうでない場合は、いつでも手動で一般的なソリューションを構築できます。

于 2012-05-15T19:19:29.333 に答える