我希望以参数的形式将function getCoordinates
的返回对象文字(经度和纬度坐标)传递给function getWeather
,以便我能够访问function getCoordinates
' function getWeather
中的对象文字。或者换句话说,我希望将一个函数的输出作为输入传递给另一个函数,以便我能够访问它的数据。我将如何完成这项工作?
到目前为止,这是我的JavaScript代码:
var APP = {
getCoordinates: function () {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
var coordinates = {
latitude: position.coords.latitude,
longitude: position.coords.longitude
}
return coordinates;
});
} else {
console.log("Geolocation isn't supported in your browser.");
}
},
getWeather: function (getCoordinates) {
var api_key = '1234567890',
weather_query = 'http://api.wunderground.com/api/';
weather_query += api_key + '/geolookup/q/';
weather_query += longitude + ',' + latitude + '.json';
}
}
答案 0 :(得分:2)
var APP = {
getCoordinates: function () {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(this.getWeather);
} else {
console.log("Geolocation isn't supported in your browser.");
}
},
getWeather: function (position) {
var latitude = position.coords.latitude,
longitude = position.coords.longitude,
api_key = '1234567890',
weather_query = 'http://api.wunderground.com/api/';
weather_query += api_key + '/geolookup/q/';
weather_query += longitude + ',' + latitude + '.json';
// do weather lookup here, inside success handler of
// the geolocation call
}
}
APP.getCoordinates();
答案 1 :(得分:1)
只有return
坐标不会做任何事情。您必须接受回调参数:
var APP = {
// Get the coordinates, and then do something with them
getCoordinates: function (callback) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
var coordinates = {
latitude: position.coords.latitude,
longitude: position.coords.longitude
}
// Coordinates are ready, pass to the processing function
callback(coordinates);
});
} else {
console.log("Geolocation isn't supported in your browser.");
}
},
getWeather: function (coordinates) {
var api_key = '1234567890',
weather_query = 'http://api.wunderground.com/api/';
weather_query += api_key + '/geolookup/q/';
weather_query += coordinates.longitude + ',' + coordinates.latitude + '.json';
}
}
APP.getCoordinates(APP.getWeather);
答案 2 :(得分:1)
你要做的事是不可能的。所以你需要重新思考它。请注意navigator.geolocation.getCurrentPosition()
采用回调函数。这意味着,正如@JonathanLonowski指出的那样,该函数是异步。也就是说,只要传递给它的值变得可用,就会在稍后的时间调用回调函数。
从此回调中返回一个值没有任何好处。你需要做的是在回调中执行任何必要的操作,或者在回调调用的另一个函数中执行(基本上是相同的)。
什么代码调用getWeather()
?这是您需要查看的代码。应该在getCurrentPosition()
回调中进行调用,而不是仅仅在weather_query
回调进行调用,而不应该对getWeather()
执行任何操作。
正如代码现在所处,coordinates
实际上并没有做任何事情。它会创建一些局部变量,然后将其丢弃。所以这可能是下一个需要考虑的问题。
无论你做什么,底线都是一样的:任何依赖getCurrentPosition()
回调{{1}}的动作都需要在回调被调用时进行。
正如@adeneo所提到的,有一些工具,比如jQuery的承诺,你可以用来帮助编写更干净的代码来完成这项工作。但是,没有任何工具可以改变基本问题:你必须等到数据准备就绪,这种方式将直接或间接地从该回调中采取行动。
答案 3 :(得分:1)
Adeneo有一个很好的答案。只是为了补充它:
让我们更改getCoordinates
,以便它现在需要一个可以对位置数据执行任何处理的回调。
getCoordinates: function (callback) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(callback);
} else {
console.log("Geolocation isn't supported in your browser.");
}
},
现在,getWeather所要做的就是提供回调函数。
getWeather: function () {
var callback = function(position){
var coordinates = {
latitude: position.coords.latitude,
longitude: position.coords.longitude
};
var api_key = '1234567890',
weather_query = 'http://api.wunderground.com/api/';
weather_query += api_key + '/geolookup/q/';
weather_query += coordinates.longitude + ',' + coordinates.latitude + '.json';
console.log(weather_query);
};
APP.getCoordinates(callback);
}
您可以继续使用APP.getWeather
来获取数据。此模式可以扩展到您需要处理位置数据的任何其他类型的处理。
答案 4 :(得分:0)
为什么不这样?查看功能getWeather()
中的更改。
var APP = {
getCoordinates: function () {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
var coordinates = {
latitude: position.coords.latitude,
longitude: position.coords.longitude
}
return coordinates;
});
} else {
console.log("Geolocation isn't supported in your browser.");
}
},
getWeather: function (coordinates) {
var api_key = '1234567890',
weather_query = 'http://api.wunderground.com/api/';
weather_query += api_key + '/geolookup/q/';
weather_query += coordinates.longitude + ',' + coordinates.latitude + '.json';
}
}
// function call:
APP.getWeather(APP.getCoordinates());
答案 5 :(得分:0)
你可以使用回调函数来完成,比如
var APP = {
getCoordinates: function (cb) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(cb);
} else {
console.log("Geolocation isn't supported in your browser.");
}
},
getWeather: function () {
this.getCoordinates(function(cord){
var api_key = '1234567890',
weather_query = 'http://api.wunderground.com/api/';
weather_query += api_key + '/geolookup/q/';
weather_query += cord.longitude + ',' + cord.latitude + '.json';
// now you have it
console.log(weather_query);
});
}
}
APP.getWeather();