2017-05-18 5 views
0

コンテンツスクリプトを介してDOMからの情報を待って、それをバックグラウンドスクリプトのリスナーで使用する必要があります。chrome extension addListenerとsendMessage synchronous usage

このコードを同期して実行したいのですが、非同期の問題が発生した場合、リスナーはgetFilename関数が返される前にsuggestを呼び出します。 これをどのように同期して実行できますか?

background.js

function getFilename(AAA, fn) { 
     chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
      chrome.tabs.sendMessage(tabs[0].id, {data: AAA.text }, function(response) { 
       appendfn = response.data || "SRTING"; 
       fn = fn.replace(..., '-' + appendfn); 
       return fn; // this is correct 
      }); 
     }); 
} 


chrome.downloads.onDeterminingFilename.addListener(function(downloadItem, suggest) { 
    if (downloadItem.url.substr(...) == "DOMAIN") { 
     var appendfn = ""; 
     var fn = downloadItem.filename; 

     fn = getFilename(downloadItem, fn); // why doesn't this block? is it because suggest is used as a callback? 

     console.log(fn); // undefined 
     suggest({filename : fn}) 
    } 
}); 

content.js

chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) { 
    var elm = document.querySelectorAll(... msg.data); 
    sendResponse({data: elm.text}); 
}); 

尋ねるべき正しい質問はありません:どのように私は私が得ることができるかではなく、同期これを実行しませんそれは非同期に動作するように?そのような枠組みのとき、答えは簡単です。

+1

を同期して実行することはできません。クロームAPIにコールバックを使用するオプションはありません(ブロッキングwebRequestなどの例外を除く)。コールバック内の値を使用するには、コードを適切に再作成します。また、sendMessageコールバック内の 'return fn'は何も役に立ちません。 – wOxxOm

+0

私はJSの初心者ですので、まだこの周りに私の頭を包んでいます。私はあなたがドキュメントにリンクして、あなたが言及している適切な使用法の例が望ましい場合は、感謝します。 – encore2097

+0

さて、私は、非同期のJavaScriptチュートリアルのためのグーグルがリンクするのは簡単すぎると思う。または、他の誰かがすぐに使える回答を投稿するのを待つことができます。 – wOxxOm

答えて

0

私がしなければならなかったことは、suggestの非同期呼び出しを有効にするaddListenerの最後にreturn trueでした。

優雅なJavascript-yソリューションをお持ちの場合は、

関連する問題