2012-01-10 66 views
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(); 
         } 
        } 
       }); 
} 

,我需要輸出作爲該功能的執行的結果的值是值「管」變量(var tube = tubest [1];)。基本上一個簡單的document.write將起作用。或者是一個簡單的返回值,如:

var tubestation = coord(); 

但是,我不知道如何實現這一點。

+0

你爲什麼在標題寫道: 「使用Javascript」?你有意解釋嗎? – 2012-01-10 17:46:17

+0

我乞求你的赦免,但這與我寫的 - jQuery或JavaScript有關嗎? jQuery是一個JavaScript框架,實際上任何jQuery代碼都是JavaScript。謝謝你回答我的問題,馬丁。 – cycero 2012-01-10 17:48:50

+0

我不擔心,我只是好奇,因爲許多用戶在標題中寫入標籤 - 這是錯誤的。這就是標籤在這裏:) – 2012-01-10 17:54:30

回答

0

由於您使用的是觀察者模式 - 它爲代碼設置了異步邏輯,所以不能讓此函數返回值。簡單地說,在您的coord()函數返回時,該值還沒有。

要解決這個問題,通常你會傳遞一個回調函數,然後在那裏恢復你的計算。

聲明你的函數爲:

function coord(callback) 

那麼,你知道你想要的值後,調用回調函數的值:

callback.call(null, tube); 

if { ... } else { ... }所以你的回調函數被調用後做吧無論是成功還是失敗(如果失敗,它將通過undefined,您可能需要在if之前聲明var tube = null進行更正)。

代替

那麼,:

tubestation = coord(); 

調用它像這樣:

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

你可能將無法使用document.write因爲時間使用它會是早已過去,但您可以將該值設置爲您已經生成的元素的內容。你有jQuery的在你的標籤,所以它很容易:

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

假設你在你的HTML有<div id="tube_station"/>地方。

+0

感謝您的回答,任何提示如何在這種情況下通過回調? – cycero 2012-01-10 17:50:51

+0

添加了示例。 – Amadan 2012-01-10 17:55:13

+0

謝謝你的幫助! – cycero 2012-01-10 18:09:24

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(); 
        } 
       } 
      }); 

}