等待回调在JavaScript

问题描述:

我试图创建一个返回对象有回调的信息的功能:等待回调在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

使用回调函数是因为函数是异步的。该回调将在未来的某个时间点运行。

因此,在触发回调之前返回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

我会建议在火箭的答案的方法。但是,如果您真的想,可以在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