0

Firefox WebExtentionを使ってアドオンを開発しました。 storage.local.get()がasyn関数なので、実行順序が予期したとおりではないことが分かりますが、私の質問はawaitまたは他のメソッドを使用して実行順序を修正する方法ですか?firefox webextention:storage.local.get()オプションを実行すると、結果が順番に実行されますか?

以下はバックグラウンドスクリプトです。アドオンアイコンをクリックすると、コンテンツスクリプトに「開始」メッセージが送信されます。コンテンツスクリプトからの結果を受け取ると、アイコンのタイトルが変更されます。

// background script 
function sendMessageToTabs(tabs) { 
    for (let tab of tabs) { 
    browser.tabs.sendMessage(tab.id, {start: "start"}).then(response => { 
     browser.browserAction.setTitle({title: response.complete}); 
     console.log(response.complete); 
    }).catch(onError); }} 
function onError(error) { console.log(`Error: ${error}`); } 
browser.browserAction.onClicked.addListener(function() { 
    browser.tabs.query({ currentWindow: true, active: true 
}).then(sendMessageToTabs).catch(onError); }); 

以下はコンテンツスクリプトです。これは、オプションを読み込んで処理し、フィードバック結果をバックグラウンドスクリプトに送ります。

// content script 
browser.runtime.onMessage.addListener(request => { 
    if (request.start) { var setting='5'; 
     console.log("setting default: "+setting); 
     browser.storage.local.get().then(function(options){ 
     setting=options.setting; 
     console.log("get options: "+setting); 
     },null); 
     console.log("after get options: "+setting); 
     return Promise.resolve({complete: setting+" processed"}); } }); 

コンソールログは

setting default: 5 
after get options: 5 
get options: 10 

ですが、私が欲しいのは、私は私のコードを再構築し、周りの仕事を得た

setting default: 5 
get options: 10 
after get options: 10 

答えて

0

です。以下はバックグラウンドスクリプトです。オプションを取得し、コンテンツスクリプトに「開始」メッセージを介してオプションを渡します。以下は

var setting; 
function sendMessageToTabs(tabs) { 
    for (let tab of tabs) { 
    browser.tabs.sendMessage(tab.id, {start: setting}).then(response => { 
     browser.browserAction.setTitle({title: response.complete}); 
     console.log(response.complete); 
    }).catch(onError); 
    } 
} 

function onError(error) { console.log(`Error: ${error}`); } 
browser.browserAction.onClicked.addListener(function() { 
    browser.storage.local.get().then(function(options){ 
    if(options.setting === undefined) {setting='5';} else{setting=options.setting;} 
    browser.tabs.query({ currentWindow: true, active: true }).then(sendMessageToTabs).catch(onError); 
    },null); 
}); 

スクリプトは、それがメッセージからオプションを取得し、バックグラウンドスクリプトに、その後、フィードバック結果を計算するコンテンツです。

browser.runtime.onMessage.addListener(request => { 
    if (request.start) { 
     var calculated; 
     console.log("get options: "+request.start); calculated=request.start+' setting '; 
     console.log("after get options: "+calculated); 
     return Promise.resolve({complete: calculated+" processed"}); 
    } 
}); 
関連する問題