求问,怎么才能先执行app.js,执行完了,才执行page里的js呢
发布于 5 年前 作者 juan20 8029 次浏览 来自 问答

我想在app.js里用接口获取一个参数,用到page里面,显示在页面上,但是每次页面加载完了,app.js才获取到参数,这怎么办呢??

页面onLoad时,数据接口还没执行完,没有数据,获取不到

10 回复

多谢,完美解决

用定时器来循环判断,直到值被改变了才开始加载page

包成promise,把这个promise放在全局变量里,在page里使用这个promise

优雅点的做法是用事件订阅,自己搞个EventBus,类似的方案很多。

没必要用定时器,可以加一个回调函数

例如:

if (app.xxx) {//判断有没有你要的 没有说明还没返回或者是失败了
      //操作略
    } else //这个是时候我们在app的config里定义一个函数 给请求成功后调用
      app.callback = () => {
       //操作略   这个和上面的操作是一样的
      };
    }

app请求返回成功里这样写

if (this.callback) {  //这个函数名字和你定义的一样即可
   this.callback() //执行定义的回调函数
}

希望你能够看明白,

小程序的新建范例里面就有回调函数的用法:

onLoad: function () {
   console.log('index page on load log:' + Date());
   if (app.globalData.userInfo) {
     this.setData({
       userInfo: app.globalData.userInfo,
       hasUserInfo: true
     })
   } else if (this.data.canIUse){
     // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
     // 所以此处加入 callback 以防止这种情况
     app.userInfoReadyCallback = res => {
       this.setData({
         userInfo: res.userInfo,
         hasUserInfo: true
       })
     }

//不过我还不明白app.userInfoReadyCallback这个值是从哪来的

为什么会有人说定时器这种蠢方法

不是没必要  而是不能用  不单影响性能  处理不好更有内存泄露

es6的Promise不好用么  再不行就是订阅者不可以么

接口promise化,用async/await才是这个问题的有效解决办法吧

为什么还要用这种代码去解决

这种问题一般都是需要一些app开始时候从网络请求的数据来更新页面内容,但页面渲染提前了。可以专门约定一个每个page都有的page.render()函数来渲染页面,如果发现需要的数据还没有ready干脆什么都不做,由app.onLoad在网络请求成功之后直接getCurrentPages,调用page.render就完事了。

promise、eventbus都可以解决

回到顶部