尝试通过编写一个简单的脚本在我的卵石上显示我当前的GPS位置(参见下面的代码)。
一切正常,但我无法访问GPS值。
代码构建于pebbles own geolocation example。
我的问题是我只能在功能 locationSuccess()中获取GPS数据。
如何在该功能之外访问GPS数据(即 myLat 和 myLong 的值)?我想把GPS数据放到这一行:
text : 'GPS:\n',
我正在使用CloudPebble和Pebble.js
代码:
var UI = require('ui');
var Vector2 = require('vector2');
var locationOptions = {
enableHighAccuracy: true,
maximumAge: 10000,
timeout: 10000
};
// Get the location
function locationSuccess(pos) {
console.log('\n****** START ******\nhere I am:\nlat= ' + pos.coords.latitude + ' lon= ' + pos.coords.longitude + '\n'); // Just to se that it works fine
var myLat = pos.coords.latitude;
var myLong = pos.coords.longitude;
console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END 02 ******\n'); // This does also work fine
}
function locationError(err) {
console.log('location error (' + err.code + '): ' + err.message);
}
// Make an asynchronous request
navigator.geolocation.getCurrentPosition(locationSuccess, locationError, locationOptions);
// Create a text object
var infotext = new UI.Text(
{
position: new Vector2(0, 0),
size: new Vector2(144, 168),
text : 'GPS:\n',
font: 'Gothic 28',
color: 'white',
textAlign: 'center'
});
// Create and show the location (vars x and y are empty - why?)
var infowindow = new UI.Window();
infowindow.add(infotext);
infowindow.show();
答案 0 :(得分:2)
由于我无法在您的帖子中添加评论,我将编辑我的第一个答案。对不起我的第一个答案中的错误,我对地理位置功能不太熟悉。
您在结束02 时未收到任何回复,因为功能locationSuccess()
尚未运行,因此没有为myLat
和{{1}分配任何值}。
您在结束03 时未收到回复的原因是因为函数myLong
异步工作。当您的下一个navigator.geolocation.getCurrentPosition()
执行时,它尚未完成运行,因此您的变量值仍未设置。
我建议将使用地理位置的代码包装到console.log
函数中,因为无论如何,此成功函数是该类型代码的预期区域。
通过将成功代码移动到成功函数中,您不再需要初始化纬度和经度变量,因此我从下面的代码中删除了这些变量。我还修改了原始GPS窗口文本locationSuccess
以显示:“正在加载GPS数据......”。这样infotext
会立即加载,并在infowindow
在后台运行时显示加载屏幕。
一旦找到当前位置,它将运行成功功能。我在此功能的末尾添加了一行,以更新GPS窗口中的文本以显示纬度和经度。我还在错误函数中添加了一个类似的行,让用户知道出错了什么。您无需再次致电navigator.geolocation.getCurrentPosition
或infowindow.add(infotext);
,即可在屏幕上更新文字。我还在信息窗口/文本的创建之下移动infowindow.show();
,以便成功/错误函数在创建文本UI之前不能尝试更新文本。
navigator.geolocation.getCurrentPosition
/编辑
变量var UI = require('ui');
var Vector2 = require('vector2');
var locationOptions = {
enableHighAccuracy: true,
maximumAge: 10000,
timeout: 10000
};
// Get the location
function locationSuccess(pos) {
console.log('\n****** START ******\nhere I am:\nlat= ' + pos.coords.latitude + ' lon= ' + pos.coords.longitude + '\n'); // Just to se that it works fine
var myLat = pos.coords.latitude;
var myLong = pos.coords.longitude;
console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END 01 ******\n'); // This does work fine
//modify the text within infotext to show GPS data
infotext.text('GPS:\n' + myLat + '\n' + myLong);
}
function locationError(err) {
console.log('location error (' + err.code + '): ' + err.message);
//modify the text within infotext to alert user of error
infotext.text('Error Loading GPS Data!');
}
console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END 02 ******\n');
// Create a text object
var infotext = new UI.Text(
{
position: new Vector2(0, 0),
size: new Vector2(144, 168),
text : 'Retrieving GPS Data...',
font: 'Gothic 28',
color: 'white',
textAlign: 'center'
});
// Create and show the location (vars x and y are empty - why?)
var infowindow = new UI.Window();
infowindow.add(infotext);
infowindow.show();
// Make an asynchronous request
navigator.geolocation.getCurrentPosition(locationSuccess, locationError,locationOptions);
console.log('My location\n' + myLat + ' and ' + myLong + '\n****** THE END 03 ******\n');
和myLat
是函数myLong
中的局部变量。要解决此问题,您必须更改已定义locationSuccess
和myLat
的范围。
在下面的示例中,我定义了变量 global ,以便所有脚本和函数都可以引用它们。
myLong
有关变量范围的更多信息,this是一个很好的参考。