我如何 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([])
            });
    })
}