具有超时的地理位置会导致错误处理程序被调用两次
Geolocation with timeout causes error handler to be called twice
让我们举这个失败的简单例子:
navigator.geolocation.getCurrentPosition(
function() { /* yay! */},
function(error) { console.log(error) },
{
enableHighAccuracy: true,
timeout: 5000
}
);
在 chrome 中打开开发工具。单击传感器>仿真选项卡>"仿真位置不可用"。然后将此代码粘贴到控制台中。
您将立即收到以下日志:
PositionError {message: "PositionUnavailable", code: 2, PERMISSION_DENIED: 1, POSITION_UNAVAILABLE: 2, TIMEOUT: 3}
然后 5 秒后您将收到:
PositionError {message: "Timeout expired", code: 3, PERMISSION_DENIED: 1, POSITION_UNAVAILABLE: 2, TIMEOUT: 3}
这真的是 API 的设计方式,还是 chrome 中navigator.geolocation
实现中的一个错误?
被调用两次的回调弄乱了我的一些显示代码。有没有办法将该请求的错误捆绑在一起,或者如果我们已经收到PositionUnavailable
,则忽略超时?
好吧,我仍然认为这种行为很奇怪,但我已经找到了一种可靠地将错误捆绑在一起的方法。
下面是此示例的一些伪代码:
(function() {
var detectionId = 0;
var detectionErrors = {};
var success = function() {};
var error = function(id, error) {
if (detectionErrors[id]) {
return;
}
detectionErrors[id] = error;
console.log(error);
};
document.getElementById('whatever').addEventListener('click', function() {
navigator.geolocation.getCurrentPosition(
success,
error.bind(null, detectionId),
{
enableHighAccuracy: true,
timeout: 5000
}
);
detectionId++;
});
})();
相关文章:
- 如何从Java/scala调用js美化程序
- 如何远程检查JavaScript应用程序的函数调用堆栈
- 在同一个javascript事件处理程序中调用不同的函数
- 为什么这个函数调用会破坏程序并导致未定义的变量
- Sinon Spy不使用Javascript调用或应用程序
- 未为路由器应用程序调用Node.Js的回调
- 无法在Windows 10 Cordova应用程序中从Web视图进行ajax调用
- 为什么没有调用我的流错误处理程序
- 使用jquery调用vaadin应用程序表单php
- 向调用全局javascript函数的对象添加处理程序
- Angular.js指令格式化程序只调用过一次,或者如何告诉ngModel表现得像watchCollection
- 直接在DOM事件处理程序中调用作用域函数的最短方法是什么
- 如何使应用程序加载独立于web服务调用
- 当调用JS函数具有alert()时,应用程序将被冻结
- Backbone应用程序中的多个jQueryAjax调用会混淆数据
- 从node.js应用程序调用Mongoose Model.save()时挂起
- 如何在启动时在PhoneGap应用程序中调用一些Objective C代码
- 在调用程序中获取函数从文件中读取的值:Windows应用商店JavaScript应用程序
- 如何在android webview中调用程序员定义的javascript函数
- 将此函数中的范围更改为使用 jquery 或 vanilla JavaScript 的调用程序