sunnylqm / react-native-storage

local storage wrapper for both react-native and browser. Support size controlling, auto expiring, remote data auto syncing and getting batch data in one query.
MIT License
3.02k stars 268 forks source link

resolve is not a function #197

Closed aoarashi1988 closed 5 years ago

aoarashi1988 commented 6 years ago

sync中设置,比如 userDetail(params){ let {resolve} = params resolve({}) } 然后在调用 storage.load({key: 'userDetail'}) 有时候就会出现resolve is not a function 的报错 这时候清除应用缓存又可以正常使用了 是什么原因造成的?又该怎么解决呢?

aoarashi1988 commented 5 years ago

找到问题了 我是用的 let userDetail = await storage.load({key: 'userDetail'}) 这种方式读取值的,而不是使用then,所以resolve是undefined

sunnylqm commented 5 years ago

之前代码的promise用法不正确,会在下个版本中清理修复

aoarashi1988 commented 5 years ago

之前代码的promise用法不正确,会在下个版本中清理修复

扒了一下源码,大约在storage.js 243行的位置 if(syncInBackground) { this.sync[key]({ id, syncParams }); return Promise.resolve(ret.rawData); } 这里,如果syncInBackground为true, 则传递给对应sync方法的参数只有id和syncParams, 没有resolve 和reject,所以如果直接在对应的sync函数里 const {resolve} = params 解构获取resolve,就会得到undefined 而如果不对resolve进行判空,直接调用resolve(value) 就会报错,并且导致外部await得不到期待的resolve,因为这个时候promise已经是rejected了 这个希望在文档中说明一下,sync中得到的params,并不一定总是会包含resolve和reject @sunnylqm

sunnylqm commented 5 years ago

试一下v1 beta版本, 直接在sync中返回值或者promise,不再调用resolve了 yarn add react-native-storage@beta https://github.com/sunnylqm/react-native-storage/blob/v1/README.zh-CN.md#%E5%90%8C%E6%AD%A5%E8%BF%9C%E7%A8%8B%E6%95%B0%E6%8D%AE%E5%88%B7%E6%96%B0 @aoarashi1988