求问,怎么才能先执行app.js,执行完了,才执行page里的js呢

发布于 6 年前作者 juan208269 次浏览最后编辑 6 年前来自 ask

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

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

10 回复
yang86
yang861 楼6 年前

多谢,完美解决

WXOPEN Club 内容图片
haoxiulan
haoxiulan2 楼6 年前

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

tao48
tao483 楼6 年前

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

xcheng
xcheng4 楼6 年前

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

junxu
junxu5 楼6 年前

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

例如:

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

app请求返回成功里这样写

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

希望你能够看明白,

jing24
jing246 楼6 年前

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

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这个值是从哪来的

isu
isu7 楼6 年前

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

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

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

chaoliang
chaoliang8 楼6 年前

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

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

fangjie
fangjie9 楼6 年前

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

kshao
kshao10 楼4 年前

promise、eventbus都可以解决