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});
});
尋ねるべき正しい質問はありません:どのように私は私が得ることができるかではなく、同期これを実行しませんそれは非同期に動作するように?そのような枠組みのとき、答えは簡単です。
を同期して実行することはできません。クロームAPIにコールバックを使用するオプションはありません(ブロッキングwebRequestなどの例外を除く)。コールバック内の値を使用するには、コードを適切に再作成します。また、sendMessageコールバック内の 'return fn'は何も役に立ちません。 – wOxxOm
私はJSの初心者ですので、まだこの周りに私の頭を包んでいます。私はあなたがドキュメントにリンクして、あなたが言及している適切な使用法の例が望ましい場合は、感謝します。 – encore2097
さて、私は、非同期のJavaScriptチュートリアルのためのグーグルがリンクするのは簡単すぎると思う。または、他の誰かがすぐに使える回答を投稿するのを待つことができます。 – wOxxOm