微信小程序的所有request请求都是异步的,不支持同步。但是在请求时可能会耗费一定时间,这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了。我遇到的就是拿到的数据为undefined。
解决办法,使用回调函数,等操作完成后再更改原来的值。
贴代码:(这是根据经纬度获取地理位置的一个方法)
function GetAddress(latitude, longtitude, callback, errorCallback) {var geturl = 'https://api.map.baidu.com/geocoder/v2/?ak=自己去申请后替换&location=' + latitude + ',' + longtitude + '&output=json'wx.request({url: geturl,method: 'GET',header: {'content-type': 'application/json'},success: function (res) {//json处理var jsonStr=JSON.stringify(res.data)jsonStr = jsonStr.replace(/[\\]/g, '')jsonStr = jsonStr.substring(jsonStr.indexOf('(') + 1, jsonStr.indexOf(')'))var json=JSON.parse(jsonStr)if (typeof callback == "function")callback(json.result.formatted_address)},fail: function () {if (typeof errorCallback == "function")errorCallback("获取失败")}}) }
因为返回的json格式有点问题,我进行了处理在转成Json的。这个用的是百度地图的api来获取,链接里面的AK参数就appkey,需要去百度地图官网的控制台申请,http://lbsyun.baidu.com/apiconsole/key。
下面的是调用
var s = com.GetAddress(23.10229, 113.3345211,function (data) {console.log(data);}, function (data) {console.error(data);})
小程序模块的引用就不多说了。
这个是接口返回的json
renderReverse&&renderReverse({"status":0,"result":{"location":{"lng":113.33452109999998,"lat":23.102290010605964},"formatted_address":"广东省广州市海珠区新港中路479","business":"新港,赤岗,客村","addressComponent":{"country":"中国","country_code":0,"country_code_iso":"CHN","country_code_iso2":"CN","province":"广东省","city":"广州市","city_level":2,"district":"海珠区","town":"","adcode":"440105","street":"新港中路","street_number":"479","direction":"附近","distance":"2"},"pois":[],"roads":[],"poiRegions":[],"sematic_description":"710鲜果附近12米","cityCode":257}})
方法是直接就可以用的,关于回调,单个的异步请求可以用回调函数,多个异步操作需要用promise,其他的百度大佬的博客。