var homeIndexService = {
ajax: function (option) {
return new Promise(function (resolve, reject) {
option.success = function (result, text, response) {
//成功回调
resolve({
result: result,
text: text,
response: response
});
};
option.error = function (result, text, response) {
//失败回调
reject({
result: result,
text: text,
response: response
});
};
//发起请求
$.ajax(option);
});
},
getLocationAsync: function () {
var getLocationService = {
//当前获取ip的url索引
currentUrlIndex: -1,
//获取ip的url集合
getIpUrlList: ['icanhazip.com', 'ipinfo.io/ip', 'ifconfig.me/all.xml', 'ipecho.net/plain'],
getIp: function () {
//修改索引
getLocationService.currentUrlIndex++;
if (getLocationService.currentUrlIndex < getLocationService.getIpUrlList.length) {
homeIndexService.ajax({
url: 'http://' + getLocationService.getIpUrlList[getLocationService.currentUrlIndex],
type: 'get'
}).then(response => {
//结果
var result = response.result;
//打印
console.log('getIpSuccessResult', response);
var ip = $.type(result) == 'string'
? result
: result.getElementsByTagName('ip_addr')[0].textContent;
//打印
console.log('getIpSuccess,currentIndex = ' + getLocationService.currentUrlIndex + ',ip = ' + ip);
//根据ip获取位置
getLocationService.getLocationByIp(ip);
}).catch(response => {
//获取ip失败,换下一个url获取
getLocationService.getIp();
});
} else {
//获取ip失败
getLocationService.reject(null);
}
},
getLocationByIp: function (ip) {
//百度地图秘钥
var token = '****************************************';
$.ajax({
dataType: 'JSONP',
crossDomain: true,
url: 'http://api.map.baidu.com/location/ip?ip=' + ip + '&ak=' + token,
type: 'get'
}).then(result => {
if (result.status == 0) {
//成功回调
getLocationService.resolve({
ip: ip,
address_full: result.address,
address: result.content.address,
detail: result.content.address_detail,
point: result.content.point
});
} else {
//获取位置失败,换下一个url获取
getLocationService.getIp();
}
}).catch(response => {
//获取位置失败,换下一个url获取
getLocationService.getIp();
});
},
resolve: null,
reject: null,
run: function () {
return new Promise(function (resolve, reject) {
//赋值
getLocationService.resolve = resolve;
getLocationService.reject = reject;
//打印
console.log('Begin Init Location');
//获取ip和地理位置
getLocationService.getIp();
});
}
};
//返回
return getLocationService.run();
}
};
测试:
//异步ip和地理位置
homeIndexService.getLocationAsync().then(locationInfo => {
var success = null;
//打印
console.log('locationInfo', locationInfo);
}).catch(locationInfo => {
debugger;
var error = null;
});