js如何在稍后执行的匿名函数里赋值给全局变量

时间:2021-07-31 19:13:55
我在一个匿名函数里传值给全局变量,可是接不到,那个匿名函数是稍后执行的。
代码如下

var p;//这是我要赋值的全局变量
//这是那个函数,调用百度地图
function setmap(place,university)
{
 myGeo = new BMap.Geocoder();
// 将地址解析结果显示在地图上,并调整地图视野
myGeo.getPoint(university,function(point){
if (point) {
             //经纬度
var lng=point.lng;
var lat=point.lat;
                 p={'lng':lng,'lat':lat};//给全局变量赋值
$("#alert-div").css("display","none");
map.centerAndZoom(point, 15);
map.addOverlay(new BMap.Marker(point));
}else{
//地址未解析到
$("#alert-div").css("display","block");
}
}, place);
}

//调用函数的事件在这里
$("#university").change(function(){
university=$("#university").val();
if (place!=0&&university!=0)
{
setmap(place,university);
}
});
//alert在ajax前面,按钮事件,我就不写了,但是alert发现p得不到值

14 个解决方案

#1


在else里也给p复个值 看下是没走if还是没复制

#2


函数内,看看point是否有返回值
一步步来调试

#3


你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。

#4


引用 3 楼 jslang 的回复:
你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。


点击按钮,会触发ajax提交数据,这个时候数据应该已经加载完了
重点不在ajax,我是说我在function setmap(place,university)这个函数里给全局变量赋值,然后点击按钮输出全局变量的值,却得不到,我很奇怪
@似梦非花 @ayzen1988  if语句已经执行了,这个没问题,因为地图定位了

#5


代码有最终效果可能没有问题,不代表你的过程就是对的。

地图定位是同步还是异步,你搞清楚没?

你change事件,调用setmap处理定位,并且给p赋值。你在哪里alert?这都看不到。你是让大家来玩猜迷游戏吗??

别人回答了你的问题,你没得到答案,至少先不要争辩,你先解答回答者的问题。

比如:
你说alert在ajax前面,你的ajax在哪里?什么时候调用执行?你说清楚了么?

#6


p={'lng':lng,'lat':lat};//给全局变量赋值
//你在这里alert一下p,没问题就是没问题,就肯定赋值以了,你其他什么地方有没有收到,就是你自己用法不对
            $("#alert-div").css("display","none");

#7


引用 5 楼 crying_boy 的回复:
代码有最终效果可能没有问题,不代表你的过程就是对的。

地图定位是同步还是异步,你搞清楚没?

你change事件,调用setmap处理定位,并且给p赋值。你在哪里alert?这都看不到。你是让大家来玩猜迷游戏吗??

别人回答了你的问题,你没得到答案,至少先不要争辩,你先解答回答者的问题。

比如:
你说alert在ajax前面,你的ajax在哪里?什么时候调用执行?你说清楚了么?


抱歉,没说清楚
地图是异步的,所以它是稍后执行的,我return再alert的话是先弹窗再定位,如果这时return的话得不到值,但是再刚刚赋值的时候alert只有第二次及以后触发是可以得到值的,就是说第一次没有得到值
代码如下

var p;//这是我要赋值的全局变量
//这是那个函数,调用百度地图
function setmap(place,university)
{
     myGeo = new BMap.Geocoder();
    // 将地址解析结果显示在地图上,并调整地图视野
    myGeo.getPoint(university,function(point){
        if (point) {
             //经纬度
        var lng=point.lng;
        var lat=point.lat;
                 p={'lng':lng,'lat':lat};//给全局变量赋值
            $("#alert-div").css("display","none");
            map.centerAndZoom(point, 15);
            map.addOverlay(new BMap.Marker(point));
        }else{
            //地址未解析到
            $("#alert-div").css("display","block");
        }
    }, place);
    }
 
//调用函数的事件在这里
    $("#university").change(function(){
        university=$("#university").val();
                if (place!=0&&university!=0)
        {
           alert(setmap(place,university));//alert的值是未定义
            }
        });

$("#button").click(function()
{
alert(p); //很抱歉我上面提到了ajax,表述不清,这里没有ajax的问题
//触发一次事件,点击按钮alert得不到值,触发两次事件才可以得到值,不过这个值我猜是第一次的值,所以说是可以获取到值,但我不能得到,我没有输出的时机,因为那个地图定位是异步的
// 我想及时得到那个值,然后在按下按钮之后可以alert出那个值,应该怎么办?
});

#8


引用 3 楼 jslang 的回复:
你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。

我好像知道你说的意思了,地图定位是异步的,值获取到了,但是我取用全局变量的时间不对,是吧?
那我怎么获取那个全局变量的值,那个 myGeo.getPoint,我是不是应该找到它的回调函数,然后把按钮事件放那里面,不过那样管用吗?
而且getPoint我找不到他的回调函数的参数的选项,文档好像没有。

#9


引用 6 楼 crying_boy 的回复:
p={'lng':lng,'lat':lat};//给全局变量赋值
//你在这里alert一下p,没问题就是没问题,就肯定赋值以了,你其他什么地方有没有收到,就是你自己用法不对
            $("#alert-div").css("display","none");

所以说很奇怪
function setmap(place,university)
{
     myGeo = new BMap.Geocoder();
    // 将地址解析结果显示在地图上,并调整地图视野
    myGeo.getPoint(university,function(point){
        if (point) {
             //经纬度
        var lng=point.lng;
        var lat=point.lat;
                 p={'lng':lng,'lat':lat};//给全局变量赋值
            $("#alert-div").css("display","none");
            map.centerAndZoom(point, 15);
            map.addOverlay(new BMap.Marker(point));
           alert(p);//触发可以输出正确的值,所以我想这个函数里的其他语句都是没有问题的
//如果我对全局变量的理解正确的话,那么赋值也是正确的,但是异步导致了我不能及时得到值
        }else{
            //地址未解析到
            $("#alert-div").css("display","block");
        }
    }, place);
    }

#10


引用 4 楼 u013560932 的回复:
Quote: 引用 3 楼 jslang 的回复:

你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。


点击按钮,会触发ajax提交数据,这个时候数据应该已经加载完了
重点不在ajax,我是说我在function setmap(place,university)这个函数里给全局变量赋值,然后点击按钮输出全局变量的值,却得不到,我很奇怪
@似梦非花 @ayzen1988  if语句已经执行了,这个没问题,因为地图定位了



你明明是在
myGeo.getPoint(university,function(point){ 
   //这里改变p的   这里和 setmap里  是2个概念



当myGeo.getPoint 在执行的时候  依赖p的其他事件你应该在执行完毕调用

#11


LZ,以为目前的逻辑,流程应该是这样的
你的
$("#button").click(function(){
})

必定要在

$("#university").change(function(){
})中的setmap函数被调用,且由于myGeo.getPoint()函数是异步的,所以,还必须等到这个函数执行完成以后,你的alert(p.lng)才有用

所以,如果你要测试这个p的值,你要这么测试
1:在myGeo.getPoint()中p={'lng':lng,'lat':lat};后面加一下:alert('p.lng'+lng);
2:先触发university的change事件,然后你看到第1步中的弹出提示
3:点击button按钮,触发它的事件,你再alert('btn:p.lng'+p.lng);

你再看下这个结果,p是不是有值了

#12


引用 11 楼 crying_boy 的回复:
LZ,以为目前的逻辑,流程应该是这样的
你的
$("#button").click(function(){
})

必定要在

$("#university").change(function(){
})中的setmap函数被调用,且由于myGeo.getPoint()函数是异步的,所以,还必须等到这个函数执行完成以后,你的alert(p.lng)才有用

所以,如果你要测试这个p的值,你要这么测试
1:在myGeo.getPoint()中p={'lng':lng,'lat':lat};后面加一下:alert('p.lng'+lng);
2:先触发university的change事件,然后你看到第1步中的弹出提示
3:点击button按钮,触发它的事件,你再alert('btn:p.lng'+p.lng);

你再看下这个结果,p是不是有值了

这就是我说的异步过程无法给全局变量赋值的现象
如果把按钮的点击事件放在setmap函数外面
第二步中的确可以输出值
但是第三部点击button按钮,输出未定义
如果把按钮的点击事件放在setmap函数里面
确实像你说的那样可以获取值,
但是按钮的点击事件里的代码不应该是点击之后才会执行的吗?为什么会比异步提前执行,所以我以为全局变量没有获取到值

这个里面说http://www.jb51.net/article/45432.htm
异步传参不能赋值给写在回调函数外部的全局变量
但我的提交代码显然不能全部写在setmap里,如果我写在外面,有什么方法可以让全局变量获取异步传参的值吗?

#13


……异步呀,人家执行需要时间的好吗……

你点一个按钮,直接alert一个东东,这时间就忽略不计

但人家异步,可能还要等获取数据,渲染场景什么的,这得要时间呀,我就假设是1秒,就是说1秒后才有结果

但是你点个按钮,可能半秒就完成了,人家还差半秒才给你结果呢!!你当然没东西出来

这个没那么难理解吧?

#14


引用 13 楼 crying_boy 的回复:
……异步呀,人家执行需要时间的好吗……

你点一个按钮,直接alert一个东东,这时间就忽略不计

但人家异步,可能还要等获取数据,渲染场景什么的,这得要时间呀,我就假设是1秒,就是说1秒后才有结果

但是你点个按钮,可能半秒就完成了,人家还差半秒才给你结果呢!!你当然没东西出来

这个没那么难理解吧?

我一开始和你想的一样
但不是这样的,因为地图定位完成之后那个异步就执行完了,地图定位说明执行了
           
map.centerAndZoom(point, 15);
            map.addOverlay(new BMap.Marker(point));

这两个语句,那么赋值语句也一定已经执行完了,但是再点击按钮输出还是未定义,不管等多长时间点击按钮都会输出未定义,
我想的和你一样,我觉得等一会就可以获取值了,但不是这样。
只有第二次触发onchange事件的时候,在点击按钮alert才能输出值
而且异步貌似可以赋值给全局变量,我用ajax,异步,在回执函数里赋值给全局变量,按钮事件写在回执函数外面,执行正常,可以获取到值。
所以说可能不是异步的事????
还是函数里的函数的问题?或者是百度地图那个函数的问题?

#1


在else里也给p复个值 看下是没走if还是没复制

#2


函数内,看看point是否有返回值
一步步来调试

#3


你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。

#4


引用 3 楼 jslang 的回复:
你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。


点击按钮,会触发ajax提交数据,这个时候数据应该已经加载完了
重点不在ajax,我是说我在function setmap(place,university)这个函数里给全局变量赋值,然后点击按钮输出全局变量的值,却得不到,我很奇怪
@似梦非花 @ayzen1988  if语句已经执行了,这个没问题,因为地图定位了

#5


代码有最终效果可能没有问题,不代表你的过程就是对的。

地图定位是同步还是异步,你搞清楚没?

你change事件,调用setmap处理定位,并且给p赋值。你在哪里alert?这都看不到。你是让大家来玩猜迷游戏吗??

别人回答了你的问题,你没得到答案,至少先不要争辩,你先解答回答者的问题。

比如:
你说alert在ajax前面,你的ajax在哪里?什么时候调用执行?你说清楚了么?

#6


p={'lng':lng,'lat':lat};//给全局变量赋值
//你在这里alert一下p,没问题就是没问题,就肯定赋值以了,你其他什么地方有没有收到,就是你自己用法不对
            $("#alert-div").css("display","none");

#7


引用 5 楼 crying_boy 的回复:
代码有最终效果可能没有问题,不代表你的过程就是对的。

地图定位是同步还是异步,你搞清楚没?

你change事件,调用setmap处理定位,并且给p赋值。你在哪里alert?这都看不到。你是让大家来玩猜迷游戏吗??

别人回答了你的问题,你没得到答案,至少先不要争辩,你先解答回答者的问题。

比如:
你说alert在ajax前面,你的ajax在哪里?什么时候调用执行?你说清楚了么?


抱歉,没说清楚
地图是异步的,所以它是稍后执行的,我return再alert的话是先弹窗再定位,如果这时return的话得不到值,但是再刚刚赋值的时候alert只有第二次及以后触发是可以得到值的,就是说第一次没有得到值
代码如下

var p;//这是我要赋值的全局变量
//这是那个函数,调用百度地图
function setmap(place,university)
{
     myGeo = new BMap.Geocoder();
    // 将地址解析结果显示在地图上,并调整地图视野
    myGeo.getPoint(university,function(point){
        if (point) {
             //经纬度
        var lng=point.lng;
        var lat=point.lat;
                 p={'lng':lng,'lat':lat};//给全局变量赋值
            $("#alert-div").css("display","none");
            map.centerAndZoom(point, 15);
            map.addOverlay(new BMap.Marker(point));
        }else{
            //地址未解析到
            $("#alert-div").css("display","block");
        }
    }, place);
    }
 
//调用函数的事件在这里
    $("#university").change(function(){
        university=$("#university").val();
                if (place!=0&&university!=0)
        {
           alert(setmap(place,university));//alert的值是未定义
            }
        });

$("#button").click(function()
{
alert(p); //很抱歉我上面提到了ajax,表述不清,这里没有ajax的问题
//触发一次事件,点击按钮alert得不到值,触发两次事件才可以得到值,不过这个值我猜是第一次的值,所以说是可以获取到值,但我不能得到,我没有输出的时机,因为那个地图定位是异步的
// 我想及时得到那个值,然后在按下按钮之后可以alert出那个值,应该怎么办?
});

#8


引用 3 楼 jslang 的回复:
你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。

我好像知道你说的意思了,地图定位是异步的,值获取到了,但是我取用全局变量的时间不对,是吧?
那我怎么获取那个全局变量的值,那个 myGeo.getPoint,我是不是应该找到它的回调函数,然后把按钮事件放那里面,不过那样管用吗?
而且getPoint我找不到他的回调函数的参数的选项,文档好像没有。

#9


引用 6 楼 crying_boy 的回复:
p={'lng':lng,'lat':lat};//给全局变量赋值
//你在这里alert一下p,没问题就是没问题,就肯定赋值以了,你其他什么地方有没有收到,就是你自己用法不对
            $("#alert-div").css("display","none");

所以说很奇怪
function setmap(place,university)
{
     myGeo = new BMap.Geocoder();
    // 将地址解析结果显示在地图上,并调整地图视野
    myGeo.getPoint(university,function(point){
        if (point) {
             //经纬度
        var lng=point.lng;
        var lat=point.lat;
                 p={'lng':lng,'lat':lat};//给全局变量赋值
            $("#alert-div").css("display","none");
            map.centerAndZoom(point, 15);
            map.addOverlay(new BMap.Marker(point));
           alert(p);//触发可以输出正确的值,所以我想这个函数里的其他语句都是没有问题的
//如果我对全局变量的理解正确的话,那么赋值也是正确的,但是异步导致了我不能及时得到值
        }else{
            //地址未解析到
            $("#alert-div").css("display","block");
        }
    }, place);
    }

#10


引用 4 楼 u013560932 的回复:
Quote: 引用 3 楼 jslang 的回复:

你程序处理的方式不对。你要弄明白异步加载的工作顺序。

像类似ajax需要这种异步加载数据的程序。
在ajax请求加载数据的这行代码的后面不要写任何需要用到加载的数据的代码。因为这些代码执行时数据肯定还没有加载的。
所有需要用到加载的数据的代码都必须放在数据加载完成的回调函数中才能正解获取数据。


点击按钮,会触发ajax提交数据,这个时候数据应该已经加载完了
重点不在ajax,我是说我在function setmap(place,university)这个函数里给全局变量赋值,然后点击按钮输出全局变量的值,却得不到,我很奇怪
@似梦非花 @ayzen1988  if语句已经执行了,这个没问题,因为地图定位了



你明明是在
myGeo.getPoint(university,function(point){ 
   //这里改变p的   这里和 setmap里  是2个概念



当myGeo.getPoint 在执行的时候  依赖p的其他事件你应该在执行完毕调用

#11


LZ,以为目前的逻辑,流程应该是这样的
你的
$("#button").click(function(){
})

必定要在

$("#university").change(function(){
})中的setmap函数被调用,且由于myGeo.getPoint()函数是异步的,所以,还必须等到这个函数执行完成以后,你的alert(p.lng)才有用

所以,如果你要测试这个p的值,你要这么测试
1:在myGeo.getPoint()中p={'lng':lng,'lat':lat};后面加一下:alert('p.lng'+lng);
2:先触发university的change事件,然后你看到第1步中的弹出提示
3:点击button按钮,触发它的事件,你再alert('btn:p.lng'+p.lng);

你再看下这个结果,p是不是有值了

#12


引用 11 楼 crying_boy 的回复:
LZ,以为目前的逻辑,流程应该是这样的
你的
$("#button").click(function(){
})

必定要在

$("#university").change(function(){
})中的setmap函数被调用,且由于myGeo.getPoint()函数是异步的,所以,还必须等到这个函数执行完成以后,你的alert(p.lng)才有用

所以,如果你要测试这个p的值,你要这么测试
1:在myGeo.getPoint()中p={'lng':lng,'lat':lat};后面加一下:alert('p.lng'+lng);
2:先触发university的change事件,然后你看到第1步中的弹出提示
3:点击button按钮,触发它的事件,你再alert('btn:p.lng'+p.lng);

你再看下这个结果,p是不是有值了

这就是我说的异步过程无法给全局变量赋值的现象
如果把按钮的点击事件放在setmap函数外面
第二步中的确可以输出值
但是第三部点击button按钮,输出未定义
如果把按钮的点击事件放在setmap函数里面
确实像你说的那样可以获取值,
但是按钮的点击事件里的代码不应该是点击之后才会执行的吗?为什么会比异步提前执行,所以我以为全局变量没有获取到值

这个里面说http://www.jb51.net/article/45432.htm
异步传参不能赋值给写在回调函数外部的全局变量
但我的提交代码显然不能全部写在setmap里,如果我写在外面,有什么方法可以让全局变量获取异步传参的值吗?

#13


……异步呀,人家执行需要时间的好吗……

你点一个按钮,直接alert一个东东,这时间就忽略不计

但人家异步,可能还要等获取数据,渲染场景什么的,这得要时间呀,我就假设是1秒,就是说1秒后才有结果

但是你点个按钮,可能半秒就完成了,人家还差半秒才给你结果呢!!你当然没东西出来

这个没那么难理解吧?

#14


引用 13 楼 crying_boy 的回复:
……异步呀,人家执行需要时间的好吗……

你点一个按钮,直接alert一个东东,这时间就忽略不计

但人家异步,可能还要等获取数据,渲染场景什么的,这得要时间呀,我就假设是1秒,就是说1秒后才有结果

但是你点个按钮,可能半秒就完成了,人家还差半秒才给你结果呢!!你当然没东西出来

这个没那么难理解吧?

我一开始和你想的一样
但不是这样的,因为地图定位完成之后那个异步就执行完了,地图定位说明执行了
           
map.centerAndZoom(point, 15);
            map.addOverlay(new BMap.Marker(point));

这两个语句,那么赋值语句也一定已经执行完了,但是再点击按钮输出还是未定义,不管等多长时间点击按钮都会输出未定义,
我想的和你一样,我觉得等一会就可以获取值了,但不是这样。
只有第二次触发onchange事件的时候,在点击按钮alert才能输出值
而且异步貌似可以赋值给全局变量,我用ajax,异步,在回执函数里赋值给全局变量,按钮事件写在回执函数外面,执行正常,可以获取到值。
所以说可能不是异步的事????
还是函数里的函数的问题?或者是百度地图那个函数的问题?