javascript - 如何在异步方法外 获取数值

查看:126
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆