wxpage icon indicating copy to clipboard operation
wxpage copied to clipboard

实现预加载有问题***

Open yudekai opened this issue 5 years ago • 8 comments

当第一个页面调用preload的时候会提前加载第二个页面的数据?那如果当已经跳转到第二个页面时,预加载的数据还没有完全读取完毕,怎么办?是不是还得从头开始走一遍第二个页面的读取逻辑?有没有什么办法能让它读完呢?

yudekai avatar Oct 28 '18 02:10 yudekai

一般预加载是使用提前生成Promise实例执行加载流程,只要在Promise的回调后就不需要关心异步逻辑是进行中 or 完成

switer avatar Oct 28 '18 10:10 switer

一般预加载是使用提前生成Promise实例执行加载流程,只要在Promise的回调后就不需要关心异步逻辑是进行中 or 完成

稍微有点不明白,我需要在哪里执行Promise?第一个页面还是第二个页面?有相关的示例代码吗?

yudekai avatar Nov 20 '18 05:11 yudekai

// 页面index
Page.P('index', {
   clickToDetail() {
      this.$preload('detail')
   }
})
// 页面detail
Page.P('detail', {
   onPreload() {
      this.$put('detail_preload_fetch', this.fetch())
   },
   onLoad() {
     ;(this.$take('detail_preload_fetch')||this.fetch()).then(data=>{
        console.log(data)
        // do somthing
     })
   },
   fetch() {
      return fetch('xxx')
   }
})

switer avatar Nov 20 '18 08:11 switer

嗯嗯,终于明白了,谢谢大侠! 但是这样的话,其实还是存在一个问题,就是还是有可能this.$take('detail_preload_fetch')暂时还没有数据,那这样的话就执行的是this.fetch()的返回数据。如果是这样,那么本次跳转其实就没有达到预加载的效果,对吧?当然这个要看网络情况,如果网络良好,多半跳转还是能够在onLoad时拿到缓存数据的。不知道我理解的有问题吗?

yudekai avatar Nov 20 '18 08:11 yudekai

中间利用的是小程序页面实例化的时间差,不管怎样,请求都是被提前发起了,必然会起到优化效果

switer avatar Nov 21 '18 05:11 switer

中间利用的是小程序页面实例化的时间差,不管怎样,请求都是被提前发起了,必然会起到优化效果

这样理解也对,嗯。感谢。

yudekai avatar Nov 21 '18 05:11 yudekai

文档不是讲$preload的数据不一定会被用到 这种预加载的数据一般会保存在storage内,因为用户不一定会马上访问页面,而把数据存在全局变量会增加小程序占用的内存。微信会毫不犹豫的把内存占用过大的小程序给杀掉 如果这样的话 put take 就不适用了吧

ice0526 avatar Jun 25 '19 08:06 ice0526

文档不是讲$preload的数据不一定会被用到 这种预加载的数据一般会保存在storage内,因为用户不一定会马上访问页面,而把数据存在全局变量会增加小程序占用的内存。微信会毫不犹豫的把内存占用过大的小程序给杀掉 如果这样的话 put take 就不适用了吧

这就需要你的判断了,我的页面大多是消息页用户需要停留一段时间,这个时间我就会把页面可以触及的链接给预加载了,而在当前页面的unload中我又注册了一个清除所有子页面预加载数据的逻辑。这样的话能有效减少页面的内存占用。

Mister-Hope avatar Jun 25 '19 10:06 Mister-Hope