0

我有以下 JavaScript 函数,它接收坐标并返回最近的地铁站:

    function coord() {

                var metro = new YMaps.Metro.Closest(new YMaps.GeoPoint(<?=getCoords($addr) ?>), { results : 1 } )

                YMaps.Events.observe(metro, metro.Events.Load, function (metro) {
                    if (metro.length()) {
                        metro.setStyle("default#greenSmallPoint");
                        var firstStation = metro.get(0);
                        var tubest = (firstStation.text).split("метро ");
                            var tube = tubest[1];
                        if($("span#tubest").text() == '') {
                            $('.whiteover').hide();
                        }
                    } else {
                        if($("span#tubest").text() == '') {
                            $('.whiteover').hide();
                        }
                    }
                });
}

作为这个函数执行的结果,我需要输出的值是“tube”变量的值(var tube = tubest[1];)。基本上一个简单的 document.write 就可以了。或者一个简单的返回值,例如:

var tubestation = coord();

但是我不确定如何实现这一目标。

4

2 回答 2

0

你不能让这个函数返回值,因为你使用的是观察者模式——它为代码设置了一个异步逻辑。简单地说,在您的coord()函数返回时,该值尚不存在。

为了解决这个问题,通常你会传递一个回调函数,然后在那里恢复你的计算。

将您的功能声明为:

function coord(callback)

然后,在你知道你想要的值之后,用这个值调用回调:

callback.call(null, tube);

在您之后执行此操作,if { ... } else { ... }以便您的回调在成功和失败时都被调用(失败时它将通过undefined,您可能希望通过var tube = null在 之前声明来更正它if)。

然后,而不是:

tubestation = coord();

像这样称呼它:

coord(function(tubestation) {
  // continuation of your code here
});

您可能无法使用document.write,因为使用它的时间已经过去了,但您可以将值设置为您已经生成的元素的内容。你的标签中有 jQuery,所以很容易:

coord(function(tubestation) {
  $('#tube_station').text(tubestation);
});

假设您<div id="tube_station"/>的 HTML 中有某处。

于 2012-01-10T17:47:39.317 回答
0

这个简单的添加到那个功能怎么样?

   function coord() {

            var metro = new YMaps.Metro.Closest(new YMaps.GeoPoint(<?=getCoords($addr) ?>), { results : 1 } )

            YMaps.Events.observe(metro, metro.Events.Load, function (metro) {
                if (metro.length()) {
                    metro.setStyle("default#greenSmallPoint");
                    var firstStation = metro.get(0);
                    var tubest = (firstStation.text).split("метро ");
                        var tube = tubest[1];

$('div#myDivResult').html(管)

                        if($("span#tubest").text() == '') {
                        $('.whiteover').hide();
                    }
                } else {
                    if($("span#tubest").text() == '') {
                        $('.whiteover').hide();
                    }
                }
            });

}

于 2012-01-10T17:50:23.313 回答