Chrome扩展同步问题:如何等待chrome.storage.local.get完成后执行后续操作
Chrome Storage 同步问题及解决方案
我在使用chrome.storage.local.get时遇到了同步问题。
可正常运行的代码
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { console.log('chrome.runtime.onMessage.addListener: ', message) if (message.type === "NewURL") { console.log('background.js: start timer') let blockUrlList = ["youtube.com", "dict.cc"] /* chrome.storage.local.get(["block_urls"], (res) => { blockUrlList = "block_urls" in res ? res.block_urls : [] }) */ console.log(blockUrlList) chrome.tabs.query({ "url": blockUrlList.map(p => `*://*.${p}/*`)}, (tabs) => { tabs.forEach((tab) => { console.log('tab.id: ',tab.id, 'tab.url:', tab.url) }) }) } })
存在问题的代码(获取到空列表)
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { console.log('chrome.runtime.onMessage.addListener: ', message) if (message.type === "NewURL") { console.log('background.js: start timer') let blockUrlList = [] chrome.storage.local.get(["block_urls"], (res) => { blockUrlList = "block_urls" in res ? res.block_urls : [] }) console.log(blockUrlList) chrome.tabs.query({ "url": blockUrlList.map(p => `*://*.${p}/*`)}, (tabs) => { tabs.forEach((tab) => { console.log('tab.id: ',tab.id, 'tab.url:', tab.url) }) }) } })
请问如何实现同步,即等待chrome.storage.local.get执行完成后再执行chrome.tabs.query?同时我也希望chrome.tabs.query执行完成后再继续执行下一行代码。
编辑
尽管问题已被版主关闭,我还是分享自己找到的最简洁易读的解决方案:
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.type === "NewURL") { injectJS() } }) async function injectJS() { try { let blockUrlList = [] const res = await chrome.storage.local.get(["block_urls"]) blockUrlList = "block_urls" in res ? res.block_urls : [] const qryOptions = { "url": blockUrlList.map(p => `*://*.${p}/*`)} const tabs = await chrome.tabs.query(qryOptions) tabs.forEach((tab) => { chrome.scripting.executeScript({ target: {tabId: tab.id}, files: ['content/injected.js'] }) }) } catch (err) { console.log('No matching tab', err) } }
内容的提问来源于stack exchange,提问作者Ani
相关产品推荐
相关产品推荐

