Javascript 警告:承诺被拒绝,但出现非错误:[object GeolocationPositionError]
在尝试从用户的浏览器获取地理位置时,如果用户拒绝许可或阻止浏览器共享该位置,我们将从Bluebird收到控制台警告,提示:Javascript 警告:承诺被拒绝,但出现非错误:[object GeolocationPositionError],javascript,browser,geolocation,bluebird,navigator,Javascript,Browser,Geolocation,Bluebird,Navigator,在尝试从用户的浏览器获取地理位置时,如果用户拒绝许可或阻止浏览器共享该位置,我们将从Bluebird收到控制台警告,提示:警告:承诺被拒绝,但没有错误:[object GeolocationPositionError] 但是,当我们捕获并记录错误时,会收到错误消息:User denied geolocation prompt,它来自geolocation API的。我设想,对于返回GeolocationPositionError(内部位置错误或超时)的其他两种情况,也会记录相同的警告 那么,为什
警告:承诺被拒绝,但没有错误:[object GeolocationPositionError]
但是,当我们捕获并记录错误时,会收到错误消息:User denied geolocation prompt
,它来自geolocation API的。我设想,对于返回GeolocationPositionError(内部位置错误或超时)的其他两种情况,也会记录相同的警告
那么,为什么我们会收到控制台警告,我们如何正确处理它呢
以下是处理浏览器导航器和地理位置的代码:
import Promise from 'bluebird';
function getUserLocation() {
return new Promise(function(resolve, reject) {
if (navigator && navigator.geolocation) {
navigator.geolocation.getCurrentPosition(resolve, reject);
} else {
// Browser does not support geolocation at all
reject(new Error('Geolocation is unsupported'));
}
});
}
在阅读Bluebird关于其警告消息的文档时,我发现问题在于它不是一个Javascript
错误
实例,而这正是Bluebird所期望的。因此,相反,定制reject()
回调以显式地将GeolocationPositionError强制转换为错误
解决了任何GeolocationPositionError情况下的控制台警告和错误处理
import Promise from 'bluebird';
export function getUserLocation() {
return new Promise(function(resolve, reject) {
if (navigator && navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
resolve,
(geolocationPositionError) => { // reject
// Note: must explicitly cast the `GeolocationPositionError` as an Error instance since bluebird explicitly expects a javascript Error object
// see http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-rejected-with-a-non-error
// and `GeolocationPositionError` is not an Error instance, see https://developer.mozilla.org/en-US/docs/Web/API/GeolocationPositionError
return reject(new Error(geolocationPositionError));
}
);
} else {
// Browser does not support geolocation at all
reject(new Error('Geolocation is unsupported'));
}
});