收藏
回答

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

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


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

最后一次编辑于  2018-08-30  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

11 个回答

  • Embrace
    Embrace
    2018-08-31

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

    例如:

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

    app请求返回成功里这样写

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

    希望你能够看明白,

    2018-08-31
    赞同 4
    回复 11
    • 陈
      2018-08-31

      那你知道你这样写,直到app.js执行完成你写的会执行多少次吗

      2018-08-31
      回复
    • Embrace
      Embrace
      2018-08-31回复

      一次啊

      2018-08-31
      回复
    • 陈
      2018-08-31回复Embrace

      那我要是长时间没有执行完成呢,如果你还是执行一次那就比我的方法好,你是验证过可以吗?

      2018-08-31
      回复
    • Embrace
      Embrace
      2018-08-31

      如果你是进入page前完成了 ,你在page里也不会设置这个回调,如果你已经进入了page,发现异步还没有完成就设置这个回调,让异步完成后执行

      2018-08-31
      回复
    • 陈yob
      陈yob
      2018-08-31回复Embrace

      1、wxml


      2、wxss



      3、显示效果,想问下为啥  搜索的 icon  出不来呢? 还望多多指教

      2018-08-31
      回复
    查看更多(6)
  • 彬💤
    彬💤
    2018-08-31

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

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

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


    2018-08-31
    赞同 3
    回复 2
    • 冷冷
      冷冷
      04-03

      那比如说我的appjs里面是需要做多种判断后才能取得最后的值,比如说a存在那我的值为a,a不存在调接口b,b的返回值再来判断最终取值c或者d,这样的如何用promise呀

      04-03
      回复
    • 彬💤
      彬💤
      04-03

      所有的内部逻辑不需要管  反正只要为所有的判断最终路线后返回一个Promise就行


      无论你判断多深多复杂  只需这个方法最终返回的一定是个Promise就行了

      页面上直接等待这个Promise完成  页面不需要知道你内部做了几万个判断

      04-03
      回复
  • Null
    Null
    2018-08-31

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

    2018-08-31
    赞同 1
    回复
  • 还是赵小宇
    还是赵小宇
    2018-08-31

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

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

    2018-08-31
    赞同 1
    回复
  • NickName
    NickName
    2018-08-30

    多谢,完美解决



    2018-08-30
    赞同 1
    回复 3
    • 米儿
      米儿
      2018-08-30

      没必要用setinerval,可能会引起各种未知问题,弄一个回调函数

      2018-08-30
      回复
    • 無丶お
      無丶お
      2018-08-31

      我用的定时为什么会报参数未定义?是在page的js里面写嘛?用回调函数怎么写?

      2018-08-31
      回复
    • Embrace
      Embrace
      2018-08-31回复無丶お

      兄弟 用回调可以参照我回答的那个例子

      2018-08-31
      回复
  • 陈
    2018-08-30

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

    2018-08-30
    赞同 1
    回复 37
    • 卢霄霄
      卢霄霄
      2018-08-30

      怎么加了个先生。。有人喊你陈妹子吗。。。

      2018-08-30
      1
      回复
    • 陈
      2018-08-30回复卢霄霄

      你不说还好,你一说我都感觉怪怪的

      2018-08-30
      1
      回复
    • 卢霄霄
      卢霄霄
      2018-08-30回复

      啧。。陈妹子你好。。

      2018-08-30
      1
      回复
    • 陈
      2018-08-30回复卢霄霄

      .......我很想让你见识一下红色的感叹号

      2018-08-30
      1
      回复
    • 卢霄霄
      卢霄霄
      2018-08-30回复

      高跟鞋的脚印吗

      2018-08-30
      1
      回复
    查看更多(32)
  • 追小命
    追小命
    2018-09-01

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

    2018-09-01
    赞同
    回复
  • 马农™
    马农™
    2018-08-31

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

    2018-08-31
    赞同
    回复
  • 海
    2018-08-31

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

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

    2018-08-31
    赞同
    回复
  • #.o0OfF
    #.o0OfF
    2018-08-31

    promise、eventbus都可以解决

    2018-08-31
    赞同
    回复

正在加载...