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

getBatchDataWithIds 数据过期不会调用相应的sync方法 #202

Closed tong233 closed 6 years ago

tong233 commented 6 years ago

storage.getBatchDataWithIds数据不存在时会调用sync,数据过期则不会,同样条件下storage.load都可以。

const storageSync = {
  async enumListForWhere(params) {
    console.warn('已进入sync方法')
    const { id, resolve, reject } = params
    try {
      const ret = await getEnumListForWhere(id)
      resolve && resolve(ret)
    } catch (error) {
      reject && reject(error)
    }
  }
}

const storage = new Storage({
  size: 1000,
  storageBackend: AsyncStorage,
  defaultExpires: null,
  enableCache: true,
  sync: storageSync
})

// 过期不会不会调用sync方法
export async function  loadEnumsForWhere(ids) {
  const res = await storage.getBatchDataWithIds({
    key: 'enumListForWhere',
    ids: ids,
    autoSync: true,
    syncInBackground: true
  })
  return res
}

// load没问题
export async function loadEnumForWhere(id) {
  const res = await storage.load({
    key: 'enumListForWhere',
    id: id,
    autoSync: true,
    syncInBackground: true
  })
  return res
}
sunnylqm commented 6 years ago

因为getBatchDataWithIds的本意是减少请求,所以最终是把所有缺失和过期的数据合并为一个sync请求

tong233 commented 6 years ago

并不是你说的那样,getBatchDataWithIds这里的ids全部是过期的数据,根本没有进到sync方法里面。

tong233 commented 6 years ago

可以看下我PR,应该是修复了。还有上一个PR也是类似的问题。

sunnylqm commented 6 years ago

确实,感谢发现这个问题。测试只测试了缺失的情况,没有覆盖过期的情况。

sunnylqm commented 6 years ago

试下1.0.0-beta.0版本 现在sync方法直接返回值或者promise即可,不需要resolve了

tong233 commented 6 years ago

ok