为什么程序运行时没有按照函数的顺序运行?
发布于 6 年前 作者 maoxiuying 13694 次浏览 来自 问答
var token = '';
var timestamp = '';
var util = require('../../utils/md5.js');
var appSecret = '*******';
var sign = '';
var id = '';
var nonce = '';
var get = '';         //wx.getStorageSync('kitToken');
Page({
  /**
   * 页面的初始数据
   */
  data: {
    src: 'imou://open.lechange.com/6L088A7RAJD6B81/0/1?streamId=0',
    url: '',//测试获取图片
    kitToken: ''  //wx.getStorageSync("kitToken")
  },
  //获取id
  Id() {
    var chars = ['0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v''w''x''y''z'];
    var nums = "";
    for (var i = 0; i < 10; i++) {
      var id = parseInt(Math.random() * 32);
      nums += chars[id];
    }
    return nums;
  },

  //获取随机数nonce
  Nonce() {
    var chars = ['0''1''2''3''4''5''6''7''8''9''a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''s''t''u''v''w''x''y''z'];
    var nums = "";
    for (var i = 0; i < 32; i++) {
      var id = parseInt(Math.random() * 32);
      nums += chars[id];
    }
    return nums;
  },

  //获取经MD5校验的sign签名
  Sign(T, N, A) {
    var str = 'time:' + T + ',nonce:' + N + ',appSecret:' + A
    sign = util.hexMD5(str)
  },

  //只获取当前时间戳
  getTime() {
    timestamp = Date.parse(new Date()); //获取到的是毫秒
    timestamp = timestamp / 1000//转为时间戳 秒
    console.log("当前时间戳为:" + timestamp);
  },
  //获取当前时间,并计算出过期时间

  getOvertime() {
    this.getTime();
    let overtime = timestamp + 3600 //一个小时后是过期时间
    wx.setStorageSync('overtime', overtime)
    console.log('过期时间' + overtime)
  },

  //获取kitToken
  KitToken() {
    wx.cloud.callFunction({
      name: 'http',
      data: {
        id: id,
        time: timestamp,
        nonce: nonce,
        sign: sign
      }
    }).then(res => {
      console.log('成功了')
      console.log(res)
      var STR = JSON.parse(res.result)
      console.log(STR.result.data.accessToken)
      //  token=STR.result.data.accessToken
      //将access token存在本地缓存中,便于后期使用其他的api
      wx.setStorageSync('token', STR.result.data.accessToken)
      var storagetoken = wx.getStorageSync('token')
      console.log('储存了:' + storagetoken)
      this.getOvertime(); //不仅获取时间戳,同时token记录过期时间
      nonce = this.Nonce()
      id = this.Id()
      this.Sign(timestamp, nonce, appSecret)
      wx.cloud.callFunction({
        name: 'video',
        data: {
          id: id,
          time: timestamp,
          nonce: nonce,
          sign: sign,
          token: storagetoken
        }
      }).then(res => {
        console.log('成功获取kittoken')
        console.log(res)
        var STR = JSON.parse(res.result)
        console.log('这是res的数据:' + STR.result.data.kitToken)
        // var 
        try {
          wx.setStorageSync('kitToken', STR.result.data.kitToken)
        } catch (e) {
          console.log(e)
        }
      })
    })
  },

  //获取token,并将data值改变为可用kitToken
  Btn() {
    this.getTime();   //获得时间戳
    nonce = this.Nonce()
    id = this.Id()
    this.Sign(timestamp, nonce, appSecret)
    console.log('这是nonce:' + nonce, '这是id:' + id, '这是sign:' + sign)
    //请求获得access token
    this.KitToken()
  },

  //将本地缓存赋值给get
  getNew() {
    get = wx.getStorageSync('kitToken')
    this.setData({
      kitToken: get
    })
    console.log('成功储存了get:' + get + ',同时成功赋值给了data')
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options{
    console.log(get)
    //进入页面前先查看是否有overtime的缓存,没有则表明是首次请求,有则非首次请求
    var storagetime = wx.getStorageSync("overtime")
    var storagekit = (wx.getStorageSync("kitToken"))
    if (storagetime != "" && storagekit != "") {
      console.log(wx.getStorageSync("overtime"))
      //拿到现在时间时间戳
      this.getTime();
      //进行时间比较
      //过期了,清空缓存,重新获取token
      if (storagetime < timestamp) {
        console.log("缓存已过期");
        wx.removeStorageSync('kitToken');
        //重新请求,并将请求的新的kitToken重新放入本地缓存
        this.Btn();
        this.getNew()
      }
      else {
        console.log("可以继续使用")
        this.getNew()
        //没过期,就取出本地缓存供kitToken继续使用
      }
    }
    // 有过期时间但是kittoken为空,则清空overtime,重新请求获取新的kitToken和overtime
    else if (storagetime != "" && storagekit == "") {
      wx.removeStorageSync('overtime');
      this.Btn()
      this.getNew()
      console.log('设置kitToken成功')
      console.log('这是新的kit' + this.data.kitToken)
    }
    //就是首次请求
    else if (storagetime == "") {
      console.log('这是首次请求')
      this.Btn()
      this.getNew()
      console.log('请求成功')
    }
  },

我觉得很奇怪,因为按我的编写时的想法是如果是首次请求,应该执行完Btn()函数的所有内容,请求获取了所有的数据,最后才会打印出“成功储存了get:"但是看调试的打印结果是没有执行kitToken()函数的内容,不然应该get是有值,kitToken不会为空。

为什么会跳过了kitToken的内容就直接渲染了前端?是因为里面试云函数的原因?求答复

3 回复

你好,试一下使用async和await看看能否解决问题。

目测是异步的原因,

1、建议系统学一下JS的异步;

2、按以下方法修改:将后执行的代码放在前执行函数的success回调里执行。

是因为异步的原因吗,我要怎么修改才对,求各位大神指点指点

回到顶部