javascript - 如何在异步方法外 获取数值
本文介绍了javascript - 如何在异步方法外 获取数值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
var bm = new BMap.Map("l-map");
bm.centerAndZoom(ggPoint, 15);
var myGeo = new BMap.Geocoder();
// 将地址解析结果显示在地图上,并调整地图视野
myGeo.getPoint(strInput, function (point) {
if (point) {
//////
} else {
alert("您选择地址没有解析到结果!");
}
});
////在这里获取point
解决方案
首先你应该需要知道异步流程:
+-----------------+
| getPoint | ------> 后续的任务同步执行 --------
+-----------------+
|
假设3s之后异步任务返回
|_____________________异步任务返回(point)返回
异步已经把当前的任务挂起了,就相当于异步任务和同步任务已经分离成了两条分支(当然真正原理上异步任务会插入到同步任务中,javascript异步模型请参考:《javascript Event loop》)
你想要在异步任务后获取point,只能在异步任务的后面获取,而不应该在同步任务的后面获取:
+-----------------+
| getPoint | ------> 这里拿不到point
+-----------------+
|
假设3s之后异步任务返回
|_____________________异步任务返回(point)返回 ---------- > 这里才能拿到point
所以你希望在getPoint的同步代码里是拿不到point的,但是可以使用异步的库,来让代码扁平化(看起来像同步任务一样,但其实只是把异步任务给封装起来了),比如ES6的Promise:
var bm = new BMap.Map("l-map");
bm.centerAndZoom(ggPoint, 15);
var getPoint = function () {
//使用Promise包装异步任务,让后续的代码看起来更加扁平(像同步任务一样,但其实仍然是异步任务)
return new Promise(function (resolve, reject) {
var myGeo = new BMap.Geocoder();
myGeo.getPoint(strInput, function (point) {
if (point) {
resolve(point);
} else {
reject("您选择地址没有解析到结果!");
}
});
});
};
var asyncPoint = getPoint().then(function (point) {
//你的逻辑处理
return point;//可以继续往下传递
}, function (message) {
alert(message);//您选择地址没有解析到结果!
});
asyncPoint.then(function (point) {
//可以继续获取point处理
});
关于Promise可以参考我的这篇文章:《JavaScript异步编程(1)- ECMAScript 6的Promise对象》。
因为Promise是ES6规范下的,需要在很新的浏览器环境下运行,所以我也编写了相应的兼容版Promise,实现了低版本浏览器的Promise,并且和原生Promise API达到了95%的相似度:Github - Promise。
这篇关于javascript - 如何在异步方法外 获取数值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文