在RN中获取当前用户坐标的最佳方法是什么?

111*_*110 6 ecmascript-6 react-native react-native-android react-native-ios

我想创建一个用于获取用户坐标的函数,但我发现我不确定我的方法是否足够好.
我想知道其他人如何编写这个函数,以便在ios和android上100%确定.
现在我有这样的事情:

function getUserLocation(callback: func) {
  Permissions.check('location')
  .then(response => {
    if (response == 'authorized') {
      navigator.geolocation.getCurrentPosition(
        (location) => {
          callback({
              latitude: location.coords.latitude, 
              longitude: location.coords.longitude
            }, response);
        },
        (error) => {
          callback(null);
        },
        Platform.OS === 'android' ? null : {enableHighAccuracy: true, timeout: 100000, maximumAge: 1000}
      );
    } else {
      callback(null, response);
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到我想使用此函数,因此调用者可以知道是否允许使用位置以及是否获取当前坐标.
我正在尝试的是学习如何:

1.使这样的功能等待.
2.其他人如何使这样的功能(对于两种操作系统)和100%相同的功能.

Tar*_*ani 4

你的问题有两个部分

1. 使这样的函数可等待。

这可以通过向您提供如何执行此操作的逻辑来直接回答。Awaitable 实际上只是一个异步函数或者返回一个 Promise 的东西。如果你想要这种方式async,那么你需要先制作一个版本getCurrentPosition返回承诺的版本。可以像下面这样做

function getCurrentLocation(options) {
  return new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(resolve, ({code, message}) =>
      reject(Object.assign(new Error(message), {name: "PositionError", code})),
      options);
    });
};
Run Code Online (Sandbox Code Playgroud)

PS:归功于PS:上述代码/sf/answers/3110755091/

现在你可以像下面这样重写你的代码

async function getUserLocation() {
  let response = await Permissions.check('location')
  let options = Platform.OS === 'android' ? null : {enableHighAccuracy: true, timeout: 100000, maximumAge: 1000}

  if (response == 'authorized') {
      return await getCurrentLocation(options)
  }

  return null;
}
Run Code Online (Sandbox Code Playgroud)

如果你不想去promise下面的路

function getUserLocation() {
    return new Promise((resolve, reject) => {
        Permissions.check('location')
            .then(response => {
                if (response == 'authorized') {
                    navigator.geolocation.getCurrentPosition(
                        (location) => {
                            resolve({
                                latitude: location.coords.latitude,
                                longitude: location.coords.longitude
                            });
                        },
                        (error) => {
                            reject(error);
                        },
                        Platform.OS === 'android' ? null : { enableHighAccuracy: true, timeout: 100000, maximumAge: 1000 }
                    );
                } else {
                    resolve(null);
                }
            })
    });
}
Run Code Online (Sandbox Code Playgroud)

这里的一个关键点与回调不同,承诺解析单个值,这意味着您需要使用对象来返回多个参数。

2. 其他人如何使功能像这样(对于两个操作系统)并且工作100%相同。

这就是你的问题变得固执己见的地方,我可能会采取一些不同的方法,你可能会做其他事情,而另一个人可能会做完全不同的事情。但我仍然会讨论一些可能性。

拆分为多个功能

function getUserLocation() {
   if (Platform.OS === 'android')
   {
       return getUserLocationAndroid();
   } else {
       return getUserLocationIOS();
   }
}
Run Code Online (Sandbox Code Playgroud)

维护键值对

您可以拥有根据操作系统自动绑定功能的代码。

Utils = {
   getFunction(name) {
      if ((name + Platform.OS) in this)
          return this[name + Platform.OS]
      return this[name];
   }
   getLocation: function() {}
   //getLocationandroid: function() {}
}
Run Code Online (Sandbox Code Playgroud)

因此,默认情况下,您必须为getLocation两个操作系统提供服务,但如果其中一个操作系统代码偏差太大,您将为其创建一个新函数。代码如下所示

Utils.getFunction("getLocation")(...)
Run Code Online (Sandbox Code Playgroud)

具有分支的一个函数

这就是您当前的方法。我会坚持这一点,只要函数易于理解并且有明确的意图,代码的哪一部分执行特定于平台的内容

同样,这里可能还有 10 种不同的方式,但这最终取决于一件事,即哪种方式更容易维护、理解使用。有些方法也是特定于用例的,您可以根据用例混合多种方法