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




