小程序项目复盘(二) wx.request异步请求处理

在写请求时,会碰到在success回调函数中将res.data赋给变量,然而在wx.request外仍为undefined的问题,情境如下:

按照我们预想的顺序,应该先后输出的text值为 hi,in,out

  onLoad: function (options) {
    var text="hi"
    console.log(text);
    wx.request({
      url: ,
      method: "get",
      data: {
        "msg": {
          "idCard":
        }
      },
      header: {
        "Content-Type": "application/json;charset=UTF-8"
      },
      success: function (res) {
        console.log(res.data.msg);
        text="in"
        console.log(text);
      },
    }),
    text="out";
    console.log(text);
  },

然而,结果却是:

原因:wx.request是异步请求,JS不会等待wx.request执行完毕再往下执行,所以JS按顺序会先执行最外面的text,等服务器返回数据以后,再执行回调函数。

如何解决?

1.将我们要设置的变量值在success回调函数中设置,简单的还行,如果我的第二个请求需要用到这个返回的数据可就惨兮兮了,我把它放到回调函数里请求,这样重复多次,想想都很酸爽,有个术语叫“回调地狱”就是这样。

2.用promise处理,现在微信已经支持promise了,改造如下:

 onLoad: function (options) {
    var text="hi"
    console.log(text);
    const promise=new Promise(function (resolve, reject) {
    wx.request({
      url: "",
      method: "get",
      data: {
        "msg": {
          "idCard": "",
        }
      },
      header: {
        "Content-Type": "application/json;charset=UTF-8"
      },
      success: function (res) {
        console.log(res.data.msg);
        text="in"
        console.log(text);
        resolve();
      },
    })
    })
    promise.then(function(){
     text="out"
     console.log(text);
    },function(){})                //第一个是resolved状态执行的函数,第二个是rejected状态执行的函数
  },

promise详情:https://es6.ruanyifeng.com/#docs/promise

改造结果:  成功!!

个人理解,promise的意义就是把回调函数里的内容更简洁化了,清晰明了,在请求少的情况下感觉和在外写一个函数放进来没差,数量多它的结构优势就体现了:

var p1 = new Promise(function(resolve,reject){
    fs.readFile(‘ ‘,function(err,data){
        if(err){
            console.log("run p1 reject")
            reject(err)
        }else{
            console.log("run p1 resolve")
            resole(data.toString())
        }
    })
})

var p2 = new Promise(function(resolve,reject){
    fs.readFile(‘ ‘,function(err,data){
        if(err){
            console.log("run p2 reject")
            reject(err)
        }else{
            console.log("run p2 resolve")
            resole(data.toString())
        }
    })
})

var p3 = new Promise(function(resolve,reject){
    fs.readFile(‘ ‘,function(err,data){
        if(err){
            console.log("run p3 reject")
            reject(err)
        }else{
            console.log("run p3 resolve")
            resole(data.toString())
        }
    })
})

p1.then(function(data){
    console.log(‘p1 then resolve‘,data)
    return p2
})
.then(function(data){
    console.log(‘p2 then resolve‘,data)
    return p3
})
.then(function(data){
    console.log(‘p3 then resolve‘,data)
})

不难看出,每一次promise都把返回值传给了下一个promise,以达到一直传递下去的目的,是不是很清晰明了!

原文地址:https://www.cnblogs.com/xmjs/p/12590479.html

时间: 2024-10-01 11:25:47

小程序项目复盘(二) wx.request异步请求处理的相关文章

微信小程序数据请求方法wx.request小测试

微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </view> <button bindtap="RequestData" value="Button">Button</button> 主要是一个按钮,点击后将请求的数据写入到textarea中 js文件: Page({ data:{ textd

小程序之发起请求 wx.request(object)的坑

这是官方的API,然后官方的实例中 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'content-type': 'application/json' }, success: function(res) { console.log(res.data) } }):假如你按着官方的文档写你就掉坑里了,你会发现请求回来的数据在调试的时候可以看见,等放到手机真机预览的时候你就发现请求回来

小程序项目复盘(三) 用全局变量传参的问题

全局变量传参,在正确情况下用起来确实十分方便,任何页面都能取到全局变量,但也不能滥用,举两个我在项目中用到的例子: 1.在全局变量中设置一个userInfo,用来存储我登录后的用户全部信息,这个信息在其他页面都需要用到,节约了不少事情,这是事半功倍的正确做法: 还有一些用来标识页面类型的变量,在此不一 一举例了: 2.我在全局变量中设置了两个变量:  本意是在当前页面获得的信息中,想点击某个具体信息页面使之前获得的信息传进去.如果单看仅在两个页面之间传递,是行得通的,但是我在许多页面都使用到了这

小程序项目别的页面初始化拿到的值为两种状态(已解决)

小程序项目别的页面初始化拿到的值为两种状态,其他页面拿不到app.js全局globalData下全局的cookie app.js文件 onLaunch: function () { console.log('app-onLaunch') this.getUserInfo(); }, onShow:function(){ console.log('app-onShow') }, // 获取用户信息,登录 getUserInfo: function (callBack) { let that = t

小程序项目之再填坑

简诉 是的,真的,你没有看错,我就是上次那个加薪的,但是现在问题来了,最近又搞了个小程序的需求,又填了不少坑,其中的辛酸就不说了,说多了都是泪,此处省略三千字 ---^--,说重点吧,反正最后就是差点这让老板叫走人了,你说优秀不优秀-. 前段时间网上一直说的"<你可以骂那些中年人,尤其是有车有房的-->",虽然我没有房.也没有车,但也坚决不做那个可以随便骂的中年人(人到中年不如狗??),不存在的啦,这个仇宝宝已经记下了,先分享一下最近遇到的几个坑吧. -- 我是首席填坑官-

使用mpvue开发小程序教程(二)

在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在Visual Studio Code里面打开项目文件夹,我们可以看到类似如下的文件结构: firstapp ├── package.json ├── project.config.json ├── static ├── src │ ├── components │ ├── pages │ ├── ut

【小程序源码案例】微信小程序项目开发案例分享

作者:web小二本文标签: 微信小程序 小程序源码案例 小程序项目小程序的开发,并不是适合所有公司,我今天跟大家分享小程序方面的教程,主要是供大家学习使用.学习这种东西,有时候则是单纯的喜欢,没有任何目的,很单纯的为了好玩,记得很早之前学flash,没有想法,就是觉得好玩,纯娱乐爱好而已.到后来玩视频剪辑也是出于同样的原因,不图钱财名利,只是图自己个人爱好娱乐. 但是,学习,有时候则是需要有明确目的,特别是关系到自己吃饭问题的时候,你就需要非常有目的去学习,并且还需要制定好学习的计划与目标,希望

微信点餐小程序项目+毕业论文

好久之前写的微信点餐小程序项目了.大学也没学到多少东西,大三才开始认真的学习微信小程序开发,也是为了自己的毕业设计着想.随着互联网时代的到来,人们对网络了依赖度大大提高,越来越喜欢更便捷的消费方式.试想我们到餐馆消费,拿出手机扫一下二维码就可以排号.查看排队情况.查看菜单.点菜.买单,是不是很方便快捷?对餐厅的管理者来说,不需要开发或购买专门的排队软件,不需要添加额外的硬件设施,让用户扫一扫即可排号.点菜,随用随走.用户使用过小程序后,使用记录会留在微信的小程序列表中,方便用户再次使用,这又能增

微信小程序把玩(二十四)toast组件

原文:微信小程序把玩(二十四)toast组件 toast消息提示框,可用在提示一些信息,比如清楚缓存给用户一个友好的提示!或操作一些请求不想让用户有什么操作,toast也可以做到因为toast显示时其他操作是无效的 主要属性: wxml <!--点击button触发toast--> <button type="primary" bindtap="listenerButton">点击显示toast</button> <!--t