2011-08-25 207 views
14

我的問題是關於Javascript。 我有一個回調函數,它在成功的回調中接收一個Position對象。JavaScript將回調函數的返回值分配給全局變量

問題是,當我嘗試在成功的回調中將Position對象的屬性設置爲全局變量時,它只是不讓我這樣做,而且全局只是未定義。

作爲一種解決方法,而不是直接將對象屬性設置爲全局變量我試圖通過回調函數返回它,但我找不到方法將回調函數的返回值設置爲全局變量。

這是簡化的代碼。

var x; 

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

//on Successful callback receives a Position Object 
function onSuccess(position) { 
    var coords = position.coords; 
    x=coords;  // Setting directly to an object does not work x still remains undefined after succesful callback    
return coord; // Trying to set this to a global object 

} 

// onError Callback receives a PositionError object 
// 
function onError(error) { 
    alert('code: ' + error.code + '\n' + 
      'message: ' + error.message + '\n'); 
} 

回答

15

您不能從回調(在這種情況下)返回一個值。這意味着在getCurrentPosition之內,來自回調的返回值必須在某處分配。

將其分配給全局變量有效,但在您訪問該變量時,尚未分配新值。例如。

// x is assigned in `onSuccess` 
var x; 
navigator.geolocation.getCurrentPosition(onSuccess, onError); 
alert(x); // will be undefined, the response is not processed yet 

想一想:getCurrentPosition可能是在做一個Ajax請求來獲取位置。這樣的請求需要(a)時間(幾毫秒),並且因爲(b)是異步,這意味着JavaScript 不會等待,直到收到響應。你的代碼是的方式更快。當您提醒x時,尚未呼叫onSuccess

只有解決辦法:

所有具有訪問位置是在或回調調用的代碼。

+0

其實好點,我的回答是我的一個愚蠢的監督。代碼不是線性的,所以你需要在回調中做任何你想做的事情來確保值已經綁定 – WickyNilliams

+0

你確實是對的。getCurrentPosition函數試圖獲取異步的地理位置這就是爲什麼當我嘗試從全局變量訪問它時,它可能沒有設置並返回undefined.Isnt有辦法在異步函數完成它的工作後將變量賦值給返回值? –

+0

@Torukojin:不,值得回到哪裏?如上所述,代碼異步運行。這就是爲什麼該值作爲參數傳遞給回調函數的原因,以便您可以使用它並根據需要執行任何操作。如果有可能「返回」這個值,那麼'getCurrentPosition'就可以做到這一點。但事實並非如此,因此你提供了一個回調。也許你會發現[這篇文章](http://felix-kling.de/blog/2011/01/14/how-to-return-data-from-an-ajax-call/)有助於理解問題(但我在寫作方面並不擅長)) –

0

您是否嘗試過通過全球window對象設置它?

//on Successful callback receives a Position Object 
function onSuccess(position) { 
    var coords = position.coords; 
    window.x=coords;  // Setting directly to an object does not work x still remains undefined after succesful callback    
return coord; // Trying to set this to a global object 

} 

此外,由於您從成功處理程序返回座標,是否沒有另一種方法獲取此值?

0

console.log(x);只是x=cords後檢查值(適用於Chrome和FF與螢火)

做到這一點也正好的onSuccess的調用之後。

也不要忘記,有異步代碼在JS(如果你使用AJAX來獲取位置),也許你只是沒有得到答案,當你檢查正如描述的x

+0

其實我已經這樣做了,雖然我沒提到:) –

1

值Felix King,你不能從回調和全局變量變量中返回一個值,直到AJAX請求完成並調用回調(因此它的名字!)之後,該變量纔會被設置。

如果您有某種處理循環,則可以使用全局變量來解決問題,您可以將此代碼添加到該循環中,以便在協調更改時執行所需的操作。

if (coord) // global variable has a new value 
    // process it 
    alert('code: ' + error.code + '\n' + 
      'message: ' + error.message + '\n'); 
    // then clear it 
    coord = null; 
    } 
0

您可以實現一個輔助方法一樣流淌:

var LocationHelper = function() {}; 

LocationHelper.prototype.getLocation = function(callback) { 

    navigator.geolocation.getCurrentPosition(onSuccess, onError); 

    function onSuccess(pos) { 
     callback({ 
      pos: pos 
     }); 
    } 

    function onError(message) { 
     callback({ 
      message: message 
     }); 
    } 

    }; 
相關問題