第一次看到小程序的网络请求,尤其是演示例子中,userInfoReadyCallback这个函数更是一头雾水。其实我也不是很懂。总是让人摸不着头脑。网上的英雄都有解释,只是我不知道顺序是什么,而且我也是一个非常关注程序执行过程的人。现在,我想和你分享我的心。如有误解,望指教。下面这段代码是小程序快速创建项目的代码,里面有相关的解释。我将删除一些我们不使用的,并在这里集中讨论网络请求。
App {

//显示本地存储能力
var logs = wx.getStorageSync || []
logs.unshift)
wx.setStorageSync
//登录
wx .登录
//获取用户信息
wx.getSetting {
//授权,可以直接调用getUserInfo获取头像昵称,不用弹出框。
wx.getUserInfo {
this.userInfoReadyCallback
}
}
})
}
}
})
},
全局数据:{
userInfo: null
}
})
//index.js
//获取应用程序实例
const app = getApp
页
},
//事件处理函数
bindViewTap:函数{
wx .导航
},
onLoad:函数{
如果{
this.setData
}否则如果{
//由于getUserInfo是一个网络请求,可能会在Page.onLoad之后返回
//所以在这里添加回调来防止这种情况。

app . userinfoeadycallback = RES = > {
this.setData
}
}否则{
//没有open-type=getUserInfo版本的兼容处理时
wx.getUserInfo
}
})
}
},
getUserInfo: function {
console.log
app . global data . userinfo = e . detail . userinfo
this.setData
}
})
这里重点说一下index.js的这一段。
//由于getUserInfo是一个网络请求,可能会在Page.onLoad之后返回
//所以在这里添加回调来防止这种情况。
app . userinfoeadycallback = RES = > {
this.setData
}
这到底代表了什么?首先,这只是一个方法的定义。而且,这个方法定义了一个在全局app下注册的新方法。请注意,这里只注册了一个方法。arrow =>res相当于:app . userinfoeadycallback = function {-}
当时我很困惑:这个函数定义的res是从哪里来的?如果是来自服务器的数据,有多个网络请求怎么区分?怎么知道哪个对应哪个。后来反复思考,才知道其实只是一个定义,只是没有落实。执行在这里app.js你看到了吗?这里的网络请求是wx.getUserInfo是applet的api接口函数,属于异步请求。
wx.getUserInfo {
this.userInfoReadyCallback
}
}
})
}
所以这个请求发出后,其他的事情还是可以做的,包括后期index.js页面的加载等。当索引页面加载时,会出现两种情况,一种是网络请求已经成功。在这种情况下,如果在index的onload中直接执行第一个if分支,另一个就是不成功。然后,当加载索引页时,将定义这个全局函数。注意必须定义为app。函数名。定义了这个函数之后,在系统中就会找到这个函数定义。然后,当app的web请求有反馈结果时,就会执行这个函数,将会员的信息绑定到页面上。这将正确同步数据。
可以理解为,异步加载请求后,系统还有一个监控器,随时监控结果是否返回。而在索引页加载js就意味着定义了系统方法。一旦被定义,就意味着它是全局存在的,是即时更新的。当异步加载请求有反馈时,它会判断系统当前的函数定义和状态,一旦满足提交就立即执行。
关于同步和异步请求,我们有一个非常简单的例子来说明这个问题。
同步加载试验
返回结果:

// async:true
async:真,
Ajax经常被用来及时获取后端信息。默认情况下,它是异步的。如果添加async:true,它将是同步的。同步的概念是,只有在执行了这个之后,才能执行下面的。如上例所示,如果是同步,最终结果显示ajax同步测试返回结果是因为他先执行了上面那个。如果是异步的,那么Ajax请求将被执行,页面的其余部分将继续。后来成功的功能:这个被执行了,所以一定是显示了data中的数据。经过上面的实验,我们对上面微信小程序获取用户信息的处理有了很好的理解。


