【问题标题】:Should I make the call for chrome.storage.sync.set asynchronous? [duplicate]我应该调用 chrome.storage.sync.set 异步吗? [复制]
【发布时间】:2021-01-03 19:55:07
【问题描述】:

我正在构建一个使用 chrome.storage.sync API 的扩展。我知道我必须为 chrome.storage.sync.get 使用异步代码,因为 原因(我也不完全理解) 通过使用 async/await。我是否也应该使调用 chrome.storage.sync.set 的函数也异步?所有 chrome 扩展 API 调用都应该是异步的吗?

更多信息:我正在使用反应,所以它可能与组件生命周期或事件循环有关?我不知道我很新。

【问题讨论】:

    标签: javascript reactjs google-chrome-extension async-await


    【解决方案1】:

    简短的回答:除非您想使用 await,否则无需将 Chrome 存储回调标记为异步。您也不需要将调用 Chrome 存储 API 的函数标记为异步。

    例子:

    // works just fine without async
    chrome.storage.sync.get('someKey', function(obj) {
       console.log(obj)
    })
    
    // async allows you to use await in the callback function with Promises
    chrome.storage.sync.get('someKey', async function(obj) {
       var response = await fetch('...');
    })
    
    // no need to make the outer `setData` function async
    function setData() {
      chrome.storage.sync.set({someKey: 123, function() {
        // ...
      })
    }
    

    将函数标记为async 基本上只是在其中使用await 关键字。 await 很方便,因为它解决了“回调地狱”,在这种情况下,您有许多需要回调的函数,并且您必须将它们链接在一起。

    另外,有一天(参见this bug)Chrome 的扩展 API 将返回 Promises,而不是像现在这样需要回调,因此编写 Chrome 扩展代码将更多地使用异步函数。 Firefox 已经在其扩展 API 中使用了 Promises,但出于向后兼容的原因,它也支持使用回调。

    【讨论】:

    • 问题是每当我尝试在我的反应组件中调用调用 chrome.storage.sync.get 的函数时,它总是返回未定义,所以我必须执行异步等待,所以我实际上得到了一个结果
    • 看一个最小的例子会非常有帮助,这样我们就可以看到发生了什么。但是,是的,如果你调用的函数返回一个 Promise,那么如果你不使用 await 或 promise.then(callback) 它可能无法正常工作。
    猜你喜欢
    • 2019-06-04
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多