【问题标题】:Wrapper to check permissions用于检查权限的包装器
【发布时间】:2017-01-19 09:24:20
【问题描述】:

这是我的包装函数 (checkLocationPermission),用于在尝试调用函数之前检查权限(在本例中为 geolocate())。包装器用于简化错误处理。

问题在于 async 函数相互调用,因为在 Javascript 中这是不允许的。

如何使此类包装器从 geolocate() 或作为参数传递的任何其他函数返回有效的 Promise?

async geolocate() {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        resolve(position);
      },
      (err) => {
        reject(err);
      },
      {enableHighAccuracy: true, timeout: 30000, maximumAge: 3000}
    );
  });

}

async checkPermission(permission, fn) {
  var status = await Permissions.getPermissionStatus(permission);
  if (status!='authorized') {
    Errors.permissionError();
    this.resetAfterError();
    return Promise.reject("PERMISSION ERROR");
  }
  try {
    return fn();
  } catch(err) {
      Errors.internalError(err);
      this.resetAfterError();
      return Promise.reject("ERROR OTHER");
  }
}

通话来源:

var locationPromise = this.checkPermission('location', ()=>this.geolocate());

【问题讨论】:

  • The problem is with async functions calling each other, as in Javascript it is not allowed 不确定这到底是什么意思。这段代码有什么问题?似乎locationPromise 将是geolocate 返回的承诺(我假设此代码在class 内)

标签: javascript geolocation promise async-await android-permissions


【解决方案1】:

async 函数返回一个 Promise。如果在 geolocate() 中显式创建 Promise 对象,则无需将其设为 async

不要从 async 函数返回 Promise 对象,如果你想拒绝 Promise,只需抛出一个错误:

function geolocate() {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        resolve(position);
      },
      (err) => {
        reject(err);
      },
      {enableHighAccuracy: true, timeout: 30000, maximumAge: 3000}
    );
  });
}

async function checkPermission(permission, fn) {
  var status = await Permissions.getPermissionStatus(permission);
  if (status!='authorized') {
    Errors.permissionError();
    this.resetAfterError();
    throw new Error("PERMISSION ERROR");
  }
  try {
    return fn();
  } catch(err) {
    Errors.internalError(err);
    this.resetAfterError();
    throw new Error("ERROR OTHER");
  }
}

checkPermission('location', ()=>geolocate()).then((locationPromise) => {
    //...
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2023-03-08
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多