You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Firefox扩展中Web Storage API异步获取数据返回undefined的问题咨询

问题分析与解决

这是典型的异步操作处理不当导致的问题,我来帮你拆解清楚:

为什么第一个代码会返回undefined

browser.storage.local.get()是一个异步的Promise方法,你的getSettingFromStorage函数并没有返回这个Promise,而是在内部的.then()里返回值——但这个返回值根本传递不到函数外部。当你直接alert(getSettingFromStorage('something'))时,函数还没等异步操作完成就已经执行完毕,自然返回undefined

为什么加了alert(token[item])看起来“正常”?

这其实是个错觉!你看到的“正确值”是内部.then()里的alert弹出的,而外部的alert(getSettingFromStorage('something'))依然会先弹出undefined——只是你可能没注意到弹出的顺序。异步操作的.then()会在主线程空闲时才执行,所以外部的alert先触发,然后才是内部的alert显示正确值,你误以为是外部alert返回了正确结果。

正确的解决方法

你需要让函数返回Promise,然后通过.then()或者async/await来处理异步结果:

方法1:返回Promise,用.then()处理

function getSettingFromStorage(item) { 
  // 直接返回browser.storage的Promise
  return browser.storage.local.get(item).then(token => { 
    return token[item]; 
  }); 
} 

// 调用时用.then获取结果
getSettingFromStorage('something').then(value => {
  alert(value); // 这里会弹出正确的值
});

方法2:使用async/await(更简洁)

async function getSettingFromStorage(item) { 
  const token = await browser.storage.local.get(item);
  return token[item]; 
} 

// 调用时需要在async函数里,或者用.then
(async () => {
  const value = await getSettingFromStorage('something');
  alert(value);
})();

这样就能正确获取存储里的值啦,核心就是要尊重异步操作的特性,不要试图同步获取异步返回的结果~

内容的提问来源于stack exchange,提问作者Sina

火山引擎 最新活动