2012-05-08 5 views
1

いつものように、私はGoogledこれを公正なビットとメッセージパッシングAPIを読んで、しかし、再び、私はStackOverflowで良い人に頼らなければならなかった。すべてのメッセージが渡されるまで遅延スクリプト?

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

私は、メッセージ受け渡し機能が、渡されたデータlocalStorageを利用した直後に機能しています。最初の実行では、データが十分に速く渡されないため、スクリプトは常にエラーになります。

現在、私はsetTimeout(nextFunction, 250);でこれを回避していますが、値の量とサイズが常に変更されるため、それはほとんどエレガントで実用的な解決策ではありません。値。さらに、私は想像していますが、その時代はブラウザのバージョンとユーザーのシステムに関連しています。

つまり、I は、それが動的である必要があります。

私は

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"]に実用的ではありませんプラス私もありませんそれがうまくいくかどうかを知る。

誰がどんな考えを持っていますか?

おかげ

更新:はまだ答えは、残念ながら。誰も助けを提供することはできますか? :/

+0

作成しようとしている拡張子の種類は何ですか?それはブラウザのアクションですか? 'Google Chrome拡張機能の背景ページ'と言うと、 'manifest.json'ファイルの' background.page'セクションにインクルードするhtmlの背景ページを意味しますか?バックグラウンドページからコンテンツスクリプトにデータを送信しようとしていますか? –

+0

バックグラウンドページからコンテンツスクリプトにデータを送信しようとしています。 – mythofechelon

+0

また、背景ページはmanifest.jsonファイルに含まれるHTMLファイルです。 – mythofechelon

答えて

0

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

//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(); 
}); 
+0

はい、あなたはそれを間違って解釈していると思います。私のメッセージパッシングシステムは完璧に動作します。メッセージを渡す関数にアタッチして、メッセージを同期させるための何らかの方法や追加の引数があるかどうかを尋ねていただけです。メッセージを渡すプロセスが完了するまで待機するようにしました。 – mythofechelon

+0

投稿したコードと私が投稿したコードの唯一の違いは、リクエストコールバック内で 'continueOn'を呼び出していることです。あなたは何かメッセージを送る。受信者がメッセージで処理された後、要求を送信している間に要求コールバックセットがコールバックされます。したがって、メッセージが渡され、メッセージが処理された後にのみ、プログラム制御が送信者に戻ります。これは、同期呼び出しが正しく行うこととほぼ同じです。 –

+0

しかし、私は20通のメッセージを受け取りました。私はすべての単一のメッセージのパスに関数をリンクすることはできません。それは私がやろうとしたことはそれほど実用的ではありません.. – mythofechelon

0
あなたは一般的に解決することができます

(すなわち、あなたは実行の個別のスレッド間で通信している任意のプラットフォーム上)次のいくつかの並べ替えを待っている間に、渡された情報を収集することで、この問題の場合、「働きます収集された情報の処理を開始する前に「go」メッセージを表示します。同じアイデアを使用して、送信者が完全な返信を待つようにすることができます。

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

+0

しかし、私はまだこれについて行う方法について知る必要がありますか? – mythofechelon

+0

プログラムロジック。 - while(not_go_message(recvd))のようなものbuffer + = recvd;プロセス(バッファ)。どんな言語であれ、問題の特定のバージョンを解決しています。 –

+0

JavaScriptのために存在するようなものはないと思います。 – mythofechelon

関連する問題