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%相同的功能.
你的问题有两个部分
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 种不同的方式,但这最终取决于一件事,即哪种方式更容易维护、理解使用。有些方法也是特定于用例的,您可以根据用例混合多种方法
| 归档时间: |
|
| 查看次数: |
633 次 |
| 最近记录: |