我如何 return 承诺中的数组用于 Expo / React Native 应用程序?
How can I return an array from a promise to use in an Expo / React Native app?
我正在尝试创建一个具有路由功能的应用程序,为此,我需要使用 OpenRouteService-JS API。我的设置方式是,我认为是在承诺中。
我无法从 promise 中获取数组,我已经尝试将 async 函数与 await 一起使用,但似乎没有返回任何内容,我不知道是 promise 设置错误还是异步函数设置错误。
这是承诺:
function getRoute() {
var openrouteservice = require("openrouteservice-js");
var Directions = new openrouteservice.Directions({ api_key: "######"});
// Direction Request
Directions.calculate({
coordinates: [[8.690958, 49.404662], [8.687868, 49.390139]],
profile: 'foot-walking',
extra_info: ['waytype', 'steepness'],
format: 'geojson'
})
.then(function(geojson) {
// Add your own result handling here
var PolyLine = geojson.features[0].geometry.coordinates.map(c => ({latitude: c[0], longitude: c[1]}))
console.log(PolyLine);
return PolyLine
})
.catch(function(err) {
var str = "An error occurred: " + err;
console.log(str);
});
}
这是我尝试收集它的方式:
React.useEffect(() => {
async function getPolyLine() {
const res = await getRoute(); // type: Promise<Interface>
console.log(res)
setPolyLine(res);
}
getPolyLine();
}, [])
const [polyline, setPolyLine] = React.useState()
我没有 Javascript 或 React 的实际经验,并且 promises 是一个偶然发现的有趣问题。
您需要像这样添加 return 语句:
function getRoute() {
var openrouteservice = require("openrouteservice-js");
var Directions = new openrouteservice.Directions({ api_key: "######"});
// Direction Request
return Directions.calculate({
coordinates: [[8.690958, 49.404662], [8.687868, 49.390139]],
profile: 'foot-walking',
extra_info: ['waytype', 'steepness'],
format: 'geojson'
})
.then(function(geojson) {
// Add your own result handling here
var PolyLine = geojson.features[0].geometry.coordinates.map(c => ({latitude: c[0], longitude: c[1]}))
console.log(PolyLine);
return PolyLine
})
.catch(function(err) {
var str = "An error occurred: " + err;
console.log(str);
});
}
所以在您的代码中您实际上并没有return承诺。
我想在这里我们必须创建我们的自定义 Promise 并用可能的值 解析它到 return 我们想要的语句的值。
如此处 JavaScript 所示,我们不能像您在 then 子句中尝试的那样直接从内部函数 return 语句。
尝试进行以下更改,希望它能解决您的问题:
function getRoute() {
var openrouteservice = require("openrouteservice-js");
var Directions = new openrouteservice.Directions({ api_key: "######"});
return new Promise((resolve, reject) => {
// Direction Request
Directions.calculate({
coordinates: [[8.690958, 49.404662], [8.687868, 49.390139]],
profile: 'foot-walking',
extra_info: ['waytype', 'steepness'],
format: 'geojson'
})
.then(function(geojson) {
// Add your own result handling here
var PolyLine = geojson.features[0].geometry.coordinates.map(c => ({latitude: c[0], longitude: c[1]}))
console.log(PolyLine);
resolve(PolyLine)
})
.catch(function(err) {
var str = "An error occurred: " + err;
console.log(str);
resolve([])
});
})
}
我正在尝试创建一个具有路由功能的应用程序,为此,我需要使用 OpenRouteService-JS API。我的设置方式是,我认为是在承诺中。
我无法从 promise 中获取数组,我已经尝试将 async 函数与 await 一起使用,但似乎没有返回任何内容,我不知道是 promise 设置错误还是异步函数设置错误。
这是承诺:
function getRoute() {
var openrouteservice = require("openrouteservice-js");
var Directions = new openrouteservice.Directions({ api_key: "######"});
// Direction Request
Directions.calculate({
coordinates: [[8.690958, 49.404662], [8.687868, 49.390139]],
profile: 'foot-walking',
extra_info: ['waytype', 'steepness'],
format: 'geojson'
})
.then(function(geojson) {
// Add your own result handling here
var PolyLine = geojson.features[0].geometry.coordinates.map(c => ({latitude: c[0], longitude: c[1]}))
console.log(PolyLine);
return PolyLine
})
.catch(function(err) {
var str = "An error occurred: " + err;
console.log(str);
});
}
这是我尝试收集它的方式:
React.useEffect(() => {
async function getPolyLine() {
const res = await getRoute(); // type: Promise<Interface>
console.log(res)
setPolyLine(res);
}
getPolyLine();
}, [])
const [polyline, setPolyLine] = React.useState()
我没有 Javascript 或 React 的实际经验,并且 promises 是一个偶然发现的有趣问题。
您需要像这样添加 return 语句:
function getRoute() {
var openrouteservice = require("openrouteservice-js");
var Directions = new openrouteservice.Directions({ api_key: "######"});
// Direction Request
return Directions.calculate({
coordinates: [[8.690958, 49.404662], [8.687868, 49.390139]],
profile: 'foot-walking',
extra_info: ['waytype', 'steepness'],
format: 'geojson'
})
.then(function(geojson) {
// Add your own result handling here
var PolyLine = geojson.features[0].geometry.coordinates.map(c => ({latitude: c[0], longitude: c[1]}))
console.log(PolyLine);
return PolyLine
})
.catch(function(err) {
var str = "An error occurred: " + err;
console.log(str);
});
}
所以在您的代码中您实际上并没有return承诺。
我想在这里我们必须创建我们的自定义 Promise 并用可能的值 解析它到 return 我们想要的语句的值。
如此处 JavaScript 所示,我们不能像您在 then 子句中尝试的那样直接从内部函数 return 语句。
尝试进行以下更改,希望它能解决您的问题:
function getRoute() {
var openrouteservice = require("openrouteservice-js");
var Directions = new openrouteservice.Directions({ api_key: "######"});
return new Promise((resolve, reject) => {
// Direction Request
Directions.calculate({
coordinates: [[8.690958, 49.404662], [8.687868, 49.390139]],
profile: 'foot-walking',
extra_info: ['waytype', 'steepness'],
format: 'geojson'
})
.then(function(geojson) {
// Add your own result handling here
var PolyLine = geojson.features[0].geometry.coordinates.map(c => ({latitude: c[0], longitude: c[1]}))
console.log(PolyLine);
resolve(PolyLine)
})
.catch(function(err) {
var str = "An error occurred: " + err;
console.log(str);
resolve([])
});
})
}