高德javascript-JS 回调函数如何同步执行?

问题描述

JS 回调函数如何同步执行?

for (var i = 0; i < GetDate.length; i++)
{
var markerPosition = new AMap.LngLat(CurrJD, CurrWD);
var marker = new AMap.Marker({
//map:mapObj,
position: markerPosition, //基点位置
icon: "../images/caryd.gif", //marker图标,直接传递地址url
offset: { x: -8, y: -34} //相对于基点的位置
});

---A程序点 var info = [];
var MGeocoder;
var address;
//加载地理编码插件
mapObj.plugin(["AMap.Geocoder"], function () {
MGeocoder = new AMap.Geocoder({
radius: 1000,
extensions: "all"
});

                 //返回地理编码结果
                 MGeocoder.getAddress(marker.getPosition());
                 AMap.event.addListener(MGeocoder, "complete",
                     function (data) {

--B程序点 address = data.regeocode.formattedAddress;

                     })
             });

---c程序点 info.push("目前所在位置 :" + address + "");

}

程序一直A_C_B执行,想A_B_C执行,各位大神啊??

解决方案

不行,地图解码都是异步的,无法控制,只能将B步骤放到回调函数里面,而且无法控制回调返回的循序。。

你一定要按照循序解码,不能用for语句,只能一个个来解码,成功一个后在执行下一个,自己控制解码的循序。

自己控制的话高德地图解码完成必须要能执行回调不管成功失败,要不后续的解码无法完成

你的for循环大概可以改正这样,就可以按照你的ABC来走


    function ExecGetAddr(GetDate, now) {
        //CurrJD, CurrWD这2个参数你应该是从GetDate获取的吧。。没见你用过GetDate参数
        var markerPosition = new AMap.LngLat(CurrJD, CurrWD);
        var marker = new AMap.Marker({
            //map:mapObj,
            position: markerPosition, //基点位置
            icon: "../images/caryd.gif", //marker图标,直接传递地址url
            offset: { x: -8, y: -34} //相对于基点的位置
        });

        //-- -A程序点
        var info = [];
        var MGeocoder;
        var address;
        //加载地理编码插件
        mapObj.plugin(["AMap.Geocoder"], function () {
            MGeocoder = new AMap.Geocoder({
                radius: 1000,
                extensions: "all"
            });

            //返回地理编码结果
            MGeocoder.getAddress(marker.getPosition());
            AMap.event.addListener(MGeocoder, "complete",
                     function (data) {

                         //--B程序点
                         address = data.regeocode.formattedAddress;

                         //---c程序点 ,放到里面来
                         info.push("目前所在位置 :" + address + "");

                         /////////////////////模仿for,没超过继续调用
                         now++;
                         if (now < GetDate.length) ExecGetAddr(GetDate, now);

                         /////////////////////

                     })
        });
    }
时间: 2025-01-30 14:16:48

高德javascript-JS 回调函数如何同步执行?的相关文章

js 异步操作回调函数如何控制执行顺序

 本文为大家讲解下js异步操作时回调函数如何控制执行顺序,感兴趣的朋友可以参考下 需求:  fun A() { asyn(parm1, parm2, onsuccess(){ }) ;}  fun B() {asyn(paem1, parm2, onsuccess(){}) ;}    函数B要求执行在函数A之后    异步执行  如果直接使用  A();  B();    是不能够满足执行条件的.    考虑将B作为回调函数传递给A,然后A再执行的onsucess中执行B函数  A(B); 

node.js回调函数之阻塞调用与非阻塞调用_node.js

首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善.其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者服务器端的javascript代码交给node.js来执行,让我们前端人也能作用于后台,相比之下,浏览器端的javascript代码在运行时会受到各种安全性的限制,对客户系统的操作有限,而node.js则是一个全面的后台运行时,为javascript提

详解JavaScript的回调函数_javascript技巧

本文的目录: 什么是回调或高级函数 回调函数是如何实现的 实现回调函数的基本原则 回调地狱的问题和解决方案 实现自己的回调函数 在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以"存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值". 因为function是内置对象,我

谈谈JavaScript自定义回调函数_javascript技巧

废话不多说了,直接给大家贴代码了. 背景分析 首先看一段js的代码,主要实现添加的时候首先通过异步请求判断是否存在,如果不存在的话,在进行添加操作: function add(url,data) { var isExited = isExited(data); if(!isExited){ addRequest(url, data); } } 当我添加一个数据的时候,我首先通过判断是否在数据库中存在(当然,如果前后台彻底分离的话,不应该前端进行业务逻辑的判断,前端只应该,用来展示数据),首先,i

javascript带回调函数的异步脚本载入方法实例分析

  本文实例讲述了javascript带回调函数的异步脚本载入方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this.loadCount = 0; this.totalRequire

javascript带回调函数的异步脚本载入方法实例分析_javascript技巧

本文实例讲述了javascript带回调函数的异步脚本载入方法.分享给大家供大家参考.具体实现方法如下: var Loader = function () { } Loader.prototype = { require: function (scripts, callback) { this.loadCount = 0; this.totalRequired = scripts.length; this.callback = callback; for (var i = 0; i < scri

C# dll事件中如何执行Javascript的回调函数

前言: 由于js 远程请求  XMLHttpRequest() 不支持多线程,所以用C# 写了个dll 多线程远程抓住供js调用. 最初代码为: C#代码 /// <summary> /// 异步请求入口 /// </summary> /// <param name="url">传入http地址 注意加http</param> /// <param name="timeoutStr">超时时间</pa

js 异步操作回调函数如何控制执行顺序_javascript技巧

需求: fun A() { asyn(parm1, parm2, onsuccess(){ }) ;} fun B() {asyn(paem1, parm2, onsuccess(){}) ;} 函数B要求执行在函数A之后 异步执行 如果直接使用 A(); B(); 是不能够满足执行条件的. 考虑将B作为回调函数传递给A,然后A再执行的onsucess中执行B函数 A(B); 即可实现功能需求. js是单线程的. 1.调用函数时,如果参数多于定义时的个数,则多余的参数将会被忽略,如果少于定义时的

告诉你什么是javascript的回调函数_基础知识

函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.Function对象包含一个字符串,字符串包含函数的javascript代码.假如你是从C语言或者java语言转过来的,这也许看起来很奇怪,代码怎么可能是字符串?但是对于javascript来说,这很平常.数据和代码之间的区别是很模糊的. //可以这样创建函数 var fn = new Functio