是否可以在Page配置中添加单例模式
发布于 6 年前 作者 dzhao 12575 次浏览 来自 问答

提一个需求:

wx.navigateTo 快速点击会多次加载同一页面,

是否可以在Page配置中添加 单例模式的配置。

7 回复

var isTouch=false;

Page({

    …

    onShow: function () {

        isTouch=false;

     },

    event…:function(e){

        if(isTouch) return;

        isTouch = true;

        …

    }

})

//我是这样做的,总觉得代码怪怪的

唔…写错了,第二次运行 once 时 state 是新的。

修改:Page 里得去掉那层 function。惭愧惭愧

优雅,学习了

还想到另外一种,俗称节流,也就是固定间隔时间,1s 内只能点一次这种,其实也不妙。

我会这样写,应该属于代理模式,我不太懂算法。

// fn 不运行完,再次调用 once 也没用
function once(fn) {
  var state = false;
  return function() {
    if (state) return;
    state = true;
    fn && fn.apply(this, arguments);
    state = false;
  }
}
 
Page({
  click: function(e) {
    once(() => {
      console.log(this, e)
    })()
  },
})

其实判断 fn 的结束应该是写在 fn 的回调里的,但那样的话就越改越复杂了,除非可以用 await 写法。

谢谢你,用变量阻止解决了。

微信自家的公众号也是这样的,我觉得其实是不太好解决。

因为新建一个 WebView,并非是复用同一个对象,没法用单例模式呀。

日常开发中为了解决这个问题,我多半使用的是变量加回调来阻止。

并非限制在新建对象上,而是对事件触发本身做了规定。事件内函数不运行完,不能点下一次。

其实这个方案是不太妙的,希望能看到更好的办法。

回到顶部