javascript - 如何在异步方法外 获取数值
高洛峰
高洛峰 2017-04-11 11:49:48
[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
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
怪我咯

首先你应该需要知道异步流程:

+-----------------+
|     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。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号