收藏
回答

promise优先wx.request执行,请问如何解决?

// pages/posts/posts.js
var WxParse = require('../../wxParse/wxParse.js');
const app = getApp();
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
    posts: '',//文章
    title: '',
    detailsId: '',
    postsTag: '',//标签名称
    imgUrl: '',//分享图片,
    isGoIndex: false//返回首页按钮
  },
 
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var that = this;
    // 判断数据来源
    if (options.isshare == 1) {
      console.log('我是从分享进来的', options.isshare)
      // 重新请求数据
      wx.request({
        url: app.globalData.dataUrl.testUrl || app.globalData.dataUrl.officialUrl,
        success(res) {
          console.log('详情页:请求成功', res.data.posts)
          that.setData({
            posts: res.data.posts,
            isGoIndex: true
          })
        },
        fail(res) {
          console.log('详情页:请求失败')
        }
      })
    } else {
      console.log('我是从列表进来的', that.data.isGoIndex, options.isshare)
      that.setData({
        posts: app.globalData.posts,
        isGoIndex: false
      })
    }
    // 加载数据
    app.promiseData().then(function () {
      // 数据筛选
      setTimeout(function () {// 解决异步获取步骤问题
        console.log('log页的posts数据:' + that.data.posts)
        that.data.posts.map(function (item, idx) {
          if (item.date == options.id) {
            WxParse.wxParse('article', 'html', item.content, that, 5);
            that.setData({
              title: item.title,
              detailsId: options.id,
              postsTag: item.tags[0].name//存储当前文章标签
            })
            console.log('log页最终筛选出来的数据:' + that.data.title)
          }
        })
      }, 50)
    })
  }
 
})

以上是我的代码,根据options.isshare来判断是从分享链接(1)进来的还是列表页(0)进来的,从列表页面进入页面浏览显示没有问题,但是从分享链接进入页面的时候app.promiseData()会优先于wx.request执行,倒是页面内容无法渲染展示,请问我应该如何解决此问题呢?

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

2 个回答

  • 老张
    老张
    2018-12-26

    看到promise就头疼。

    还是转成async/await方式最好。

    2018-12-26
    赞同
    回复
  • 赵青山
    赵青山
    2018-12-24

       就这玩意你封装成一个函数,然后函数的形参是一个回调函数,在获取到数据后执行,你那个app.promiseData()放到回调函数里写就行了


    if (options.isshare == 1) {

          console.log('我是从分享进来的', options.isshare)

          // 重新请求数据

          wx.request({

            url: app.globalData.dataUrl.testUrl || app.globalData.dataUrl.officialUrl,

            success(res) {

              console.log('详情页:请求成功', res.data.posts)

              that.setData({

                posts: res.data.posts,

                isGoIndex: true

              })

            }

          })

        else {

          console.log('我是从列表进来的', that.data.isGoIndex, options.isshare)

          that.setData({

            posts: app.globalData.posts,

            isGoIndex: false

          })

        }


    2018-12-24
    赞同
    回复 1
    • 赵青山
      赵青山
      2018-12-25

      你的目的是在获取数据后执行操作,回掉函数就可以解决这个问题


      onLoad:function(options){

       this.getPosts(options,()=>{

                  //这里写获取数据后的操作,预先写好操作

          })

      },


      //第二个参数是回掉函数,在获取数据后执行

      getPosts:function(options,callBack){

      var that = this;

      if (options.isshare == 1) {

            console.log('我是从分享进来的', options.isshare)

            // 重新请求数据

            wx.request({

              url: app.globalData.dataUrl.testUrl || app.globalData.dataUrl.officialUrl,

              success(res) {

                console.log('详情页:请求成功', res.data.posts)

                that.setData({

                  posts: res.data.posts,

                  isGoIndex: true

                })

                  callBack();//获取数据后执行回掉函数,即执行预先写好的操作

              }

            })

          else {

            console.log('我是从列表进来的', that.data.isGoIndex, options.isshare)

            that.setData({

              posts: app.globalData.posts,

              isGoIndex: false

            })

              callBack();//获取数据后执行回掉函数,即执行预先写好的操作

          }

      }



      2018-12-25
      回复