2012-07-31 99 views
19

我試圖創建一個返回對象有回調的信息的功能:等待回調在JavaScript

var geoloc; 

var successful = function (position) { 
    geoloc = { 
     longitude: position.coords.longitude, 
     latitude: position.coords.latitude 
    }; 
}; 

var getLocation = function() { 
    navigator.geolocation.getCurrentPosition(successful, function() { 
     alert("fail"); 
    }); 

    return geoloc; 
}; 

我怎樣才能做到這一點?函數getLocation在執行successful之前返回空值。

謝謝!

+0

'getLocation'中的'}'太多了。 – 2012-07-31 19:21:56

+0

編輯,謝謝! – palvarez89 2012-07-31 19:24:44

+3

''''''''''''''''''''''''''有太多''') – 2013-12-17 16:20:38

回答

25

使用回調函數是因爲函數是異步的。該回調將在未來的某個時間點運行。

因此,在觸發回調之前返回getLocation。這就是異步方法的工作原理。

你不能等待回調,那不是它的工作原理。您可以添加一個回調到getLocation,運行完成後運行。

var getLocation = function(callback){ 
    navigator.geolocation.getCurrentPosition(function(pos){ 
     succesfull(pos); 
     typeof callback === 'function' && callback(geoloc); 
    }, function(){ 
     alert("fail"); 
    }); 
}; 

現在不是做var x = getLocation()和期待一個返回值,你怎麼稱呼它是這樣的:

getLocation(function(pos){ 
    console.log(pos.longitude, pos.latitude); 
}); 
+0

這非常有趣!這個例子很好,對我的項目來說是完美的。 感謝您幫助我學習javascript。 – palvarez89 2012-07-31 19:55:23

+0

不客氣,兄弟!很高興我能幫忙:-) – 2012-07-31 19:56:00

+0

偶然發現了這個答案,我試圖使用websockets來傳輸位置數據,這讓我感到沮喪。這絕對是朝着正確方向邁出的一步,是否還有其他事情我應該留意,因爲我正在嘗試使用'setTimeout'或'setInterval'來執行上述操作,以每'X'秒發送位置數據。這是一個明智的做法嗎? – 2017-09-27 14:21:07

20

我會建議在火箭的答案的方法。但是,如果您真的想,可以在getLocation完成時使用jQuery延遲對象觸發代碼的其餘部分。這將使您比使用getCurrentPosition提供的回調更加精細的控制。

// create a new deferred object 
var deferred = $.Deferred(); 

var success = function (position) { 
    // resolve the deferred with your object as the data 
    deferred.resolve({ 
     longitude: position.coords.longitude, 
     latitude: position.coords.latitude 
    }); 
}; 

var fail = function() { 
    // reject the deferred with an error message 
    deferred.reject('failed!'); 
}; 

var getLocation = function() { 
    navigator.geolocation.getCurrentPosition(success, fail); 

    return deferred.promise(); // return a promise 
}; 

// then you would use it like this: 
getLocation().then(
    function (location) { 
     // success, location is the object you passed to resolve 
    }, 
    function (errorMessage) { 
     // fail, errorMessage is the string you passed to reject 
    }); 
+2

我從來沒有真正與「延遲」混淆,但這看起來很整齊。 +1 – 2012-07-31 19:57:13

+18

@火箭我剛剛開始搞亂它昨天所以現在我試圖讓每個問題看起來像一個釘子,所以我可以使用我的新錘子:P – jbabey 2012-07-31 19:58:59