Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 警告:承诺被拒绝,但出现非错误:[object GeolocationPositionError]_Javascript_Browser_Geolocation_Bluebird_Navigator - Fatal编程技术网

Javascript 警告:承诺被拒绝,但出现非错误:[object GeolocationPositionError]

Javascript 警告:承诺被拒绝,但出现非错误:[object GeolocationPositionError],javascript,browser,geolocation,bluebird,navigator,Javascript,Browser,Geolocation,Bluebird,Navigator,在尝试从用户的浏览器获取地理位置时,如果用户拒绝许可或阻止浏览器共享该位置,我们将从Bluebird收到控制台警告,提示:警告:承诺被拒绝,但没有错误:[object GeolocationPositionError] 但是,当我们捕获并记录错误时,会收到错误消息:User denied geolocation prompt,它来自geolocation API的。我设想,对于返回GeolocationPositionError(内部位置错误或超时)的其他两种情况,也会记录相同的警告 那么,为什

在尝试从用户的浏览器获取地理位置时,如果用户拒绝许可或阻止浏览器共享该位置,我们将从Bluebird收到控制台警告,提示:
警告:承诺被拒绝,但没有错误:[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'));
    }
  });