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"}); 
    } 
});