- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个使用 nativescript-geolocation
API 的简单应用程序。函数 getCurrentLocation 基本上工作正常,但是当我移动到另一个名为 maps-module.js
的文件并从文件 detail.js
的主线程调用它时,对象位置它返回为 NULL。打印控制台对象后,我意识到变量 returned_location 在函数完成查找位置之前返回。我认为这是多线程问题,但我真的不知道如何解决。这是我的文件。
detail.js
var Frame = require("ui/frame");
var Observable = require("data/observable");
var MapsModel = require("../../view-models/maps-model");
var defaultMapInfo = new MapsModel({
latitude: "10.7743332",
longitude: "106.6345204",
zoom: "0",
bearing: "0",
tilt: "0",
padding: "0"
});
var page;
var mapView;
exports.pageLoaded = function(args) {
page = args.object;
var data = page.navigationContext;
page.bindingContext = defaultMapInfo;
}
exports.onBackTap = function () {
console.log("Back to home");
var topmost = Frame.topmost();
topmost.goBack();
}
function onMapReady(args) {
mapView = args.object;
mapView.settings.zoomGesturesEnabled = true;
}
function onMarkerSelect(args) {
console.log("Clicked on " + args.marker.title);
}
function onCameraChanged(args) {
console.log("Camera changed: " + JSON.stringify(args.camera));
}
function getCurPos(args) {
var returned_location = defaultMapInfo.getCurrentPosition(); // variable is returned before function finished
console.dir(returned_location);
}
exports.onMapReady = onMapReady;
exports.onMarkerSelect = onMarkerSelect;
exports.onCameraChanged = onCameraChanged;
exports.getCurPos = getCurPos;
maps-module.js
var Observable = require("data/observable");
var Geolocation = require("nativescript-geolocation");
var Gmap = require("nativescript-google-maps-sdk");
function Map(info) {
info = info || {};
var _currentPosition;
var viewModel = new Observable.fromObject({
latitude: info.latitude || "",
longitude: info.longitude || "",
zoom: info.zoom || "",
bearing: info.bearing || "",
tilt: info.bearing || "",
padding: info.padding || "",
});
viewModel.getCurrentPosition = function() {
if (!Geolocation.isEnabled()) {
Geolocation.enableLocationRequest();
}
if (Geolocation.isEnabled()) {
var location = Geolocation.getCurrentLocation({
desiredAccuracy: 3,
updateDistance: 10,
maximumAge: 20000,
timeout: 20000
})
.then(function(loc) {
if (loc) {
console.log("Current location is: " + loc["latitude"] + ", " + loc["longitude"]);
return Gmap.Position.positionFromLatLng(loc["latitude"], loc["longitude"]);
}
}, function(e){
console.log("Error: " + e.message);
});
if (location)
console.dir(location);
}
}
return viewModel;
}
module.exports = Map;
最佳答案
如果 Shiva Prasad 的脚注 ...
"geolocation.enableLocationRequest() is also an asynchorous method"
... 是正确的,那么 geolocation.enableLocationRequest()
返回的 Promise 必须适当处理,代码将发生相当大的变化。
试试这个:
viewModel.getCurrentPosition = function(options) {
var settings = Object.assign({
'desiredAccuracy': 3,
'updateDistance': 10,
'maximumAge': 20000,
'timeout': 20000
}, options || {});
var p = Promise.resolve() // Start promise chain with a resolved native Promise.
.then(function() {
if (!Geolocation.isEnabled()) {
return Geolocation.enableLocationRequest(); // return a Promise
} else {
// No need to return anything here.
// `undefined` will suffice at next step in the chain.
}
})
.then(function() {
if (Geolocation.isEnabled()) {
return Geolocation.getCurrentLocation(settings); // return a Promise
} else { // <<< necessary to handle case where Geolocation didn't enable.
throw new Error('Geolocation could not be enabled');
}
})
.then(function(loc) {
if (loc) {
console.log("Current location is: " + loc.latitude + ", " + loc.longitude);
return Gmap.Position.positionFromLatLng(loc.latitude, loc.longitude);
} else { // <<< necessary to handle case where loc was not derived.
throw new Error('Geolocation enabled, but failed to derive current location');
}
})
.catch(function(e) {
console.error(e);
throw e; // Rethrow the error otherwise it is considered caught and the promise chain will continue down its success path.
// Alternatively, return a manually-coded default `loc` object.
});
// Now race `p` against a timeout in case enableLocationRequest() hangs.
return Promise.race(p, new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error('viewModel.getCurrentPosition() timed out'));
}, settings.timeout);
}));
}
return viewModel;
注释:
使用已解析的 native Promise 启动链与包装在 new Promise(...)
中的效果大致相同,但更清晰主要是因为链中的意外抛出保证交付错误对象在链的错误路径下,无需 try/catch/reject()
。此外,在标记为“return a Promise”的两行中,我们无需关心返回的是 Promise 还是值;两者都将被本地 Promise 链同化。
包含两个 else
子句以应对不会自动抛出的失败情况。
Promise.race()
不是必需的,但它是针对报告的问题的保障 here .内置的“超时”机制可能就足够了。这种额外的超时机制是一种“腰带式”措施。
包含一种机制,通过传递 options
对象来覆盖 viewModel.getCurrentPosition
中的硬编码默认值。要使用默认值运行,只需调用 viewModel.getCurrentPosition()
。引入此功能主要是为了允许 settings.timeout
在 Promise.race()
中重用。
编辑:
感谢@grantwparks 提供Geolocation.isEnabled()
也返回 Promise 的信息。
现在我们可以使用 p = Geolocation.isEnabled()....
启动 Promise 链并测试异步传递的 bool 值。如果 false
则尝试启用。
从那时起,如果地理定位最初启用或已经启用,Promise 链的成功路径将被遵循。启用地理定位的进一步测试消失了。
这应该有效:
viewModel.getCurrentPosition = function(options) {
var settings = Object.assign({
'desiredAccuracy': 3,
'updateDistance': 10,
'maximumAge': 20000,
'timeout': 20000
}, options || {});
var p = Geolocation.isEnabled() // returned Promise resolves to true|false.
.then(function(isEnabled) {
if (isEnabled) {
// No need to return anything here.
// `undefined` will suffice at next step in the chain.
} else {
return Geolocation.enableLocationRequest(); // returned Promise will cause main chain to follow success path if Geolocation.enableLocationRequest() was successful, or error path if it failed;
}
})
.then(function() {
return Geolocation.getCurrentLocation(settings); // return Promise
})
.then(function(loc) {
if (loc) {
console.log("Current location is: " + loc.latitude + ", " + loc.longitude);
return Gmap.Position.positionFromLatLng(loc.latitude, loc.longitude);
} else { // <<< necessary to handle case where loc was not derived.
throw new Error('Geolocation enabled, but failed to derive current location');
}
})
.catch(function(e) {
console.error(e);
throw e; // Rethrow the error otherwise it is considered caught and the promise chain will continue down its success path.
// Alternatively, return a manually-coded default `loc` object.
});
// Now race `p` against a timeout in case Geolocation.isEnabled() or Geolocation.enableLocationRequest() hangs.
return Promise.race(p, new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error('viewModel.getCurrentPosition() timed out'));
}, settings.timeout);
}));
}
return viewModel;
关于javascript - NativeScript - 地理位置 : right way to use getCurrentLocation promise function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237688/
我正在尝试使用 FusedLocationProviderClient.getCurrentLocation()。 根据文档,它应该可用 here . 但在 Android Studio 中,我收到错
当我尝试实现一个获取设备位置的简单示例时,我发现一个“看似官方”的文档:https://developer.android.com/training/location/retrieve-current
当我尝试实现一个获取设备位置的简单示例时,我发现一个“看似官方”的文档:https://developer.android.com/training/location/retrieve-current
我看到可以从 PlusClient 的 loadPerson 方法中检索到的 Person 对象有一个 getCurrentLocation() 方法。出于某种原因,我没有在在线文档中看到 getCu
我正在尝试请求当前位置,如果任务出错,则在位置打开时调用。 private void getCurrentLocation() { fusedClient.getCurrentLocation
我需要获取当前位置信息。现在我使用getLastKnownLocation但有时它可能会返回 null 或过时的信息。我正在尝试使用 requestSingleUpdate但它在 API 级别 30
对于代码量,我深表歉意,但我认为这实际上是 AppMobi 的 getCurrentLocation 函数的问题。基本上发生的事情是我将点击事件委托(delegate)给每个列表元素。然后,当您点击它
我是 React 的新手,也是 React Router 的新手。我正在构建一个显示评论列表的应用程序,当用户单击评论卡时,他们将被重定向到显示该卡详细信息的页面。我已经编写了大部分逻辑代码,但我正在
我正在使用最新版本的 react-router(版本 ^3.0.0)。 我使用 ES5 编写了以下路由: routes.js: var React = require("react"); var Ro
我一生都无法弄清楚为什么这个设置不起作用。我已经尝试解决这个问题大约 10 个小时了。我正在使用 history 3.2.1、react-router 3.0.2 和 react-router-red
我有 geolocator 包的问题,当我在 Debug模式下运行我的应用程序时一切正常,但是当我构建应用程序并使用 Release模式时,它卡在我的加载屏幕中,其中包含来自 geolocator
我正在尝试使用地理定位插件获取当前位置,我正在使用 phonegap build,并且还启用了调试。 每次当应用程序打开时,所有代码都有效并在 navigator.geolocation.getCur
我搜索返回函数 navigator.geolocation.getCurrentLocation(getLocation,err) 范围之外的 position.coords。我试过使用窗口变量,但我
本文整理了Java中com.sun.xml.bind.v2.runtime.XMLSerializer.getCurrentLocation()方法的一些代码示例,展示了XMLSerializer.g
在 Safari 或 Chrome 等标准桌面浏览器中,当您导航到 maps.google.com 等网站并点击“我的位置”按钮时,会出现一条消息,询问您是否要授予权限网站使用您的 GPS/wifi
我正在编写一个使用 nativescript-geolocation API 的简单应用程序。函数 getCurrentLocation 基本上工作正常,但是当我移动到另一个名为 maps-modul
在实现react-router时出现未捕获的类型错误:getCurrentLocation不是createHistory.js中的函数。我的代码有什么问题? var React = require('
即使在 Android 4.4.2 中关闭了位置服务,GetCurrentLocation 仍可在 Cordova/PhoneGap 应用程序上运行。 Cordova 版本为 2.9 设备是Nexus
For my specific use case, I need to fetch the device's real-time location updates and pass them t
我是一名优秀的程序员,十分优秀!