react中异步函数中的意外保留字“await”

yqkkidmi  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(330)

我是react的新手,我想获取位置坐标并将它们与参数一起传递给api,但我收到:

Unexpected reserved word 'await'

守则:

async getData() {
if (navigator.geolocation) {
  navigator.geolocation.watchPosition(function (position) {
    console.log("Latitude is :", position.coords.latitude);
    console.log("Longitude is :", position.coords.longitude);

    var lat = position.coords.latitude;
    var lon = position.coords.longitude;

    const url = `http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=ca148f5dc67f12aafaa56d1878bb6db2`;
    const response = await fetch(url);
    let data = await response.json();

    console.log(data);
  });
}

}

hfsqlsce

hfsqlsce1#

该函数需要 async . 您确实使父函数异步,但同时也传入了一个回调,而您没有使其异步

async getData() {
if (navigator.geolocation) {
  navigator.geolocation.watchPosition(async function (position) {
    console.log("Latitude is :", position.coords.latitude);
    console.log("Longitude is :", position.coords.longitude);

    var lat = position.coords.latitude;
    var lon = position.coords.longitude;

    const url = `http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=ca148f5dc67f12aafaa56d1878bb6db2`;
    const response = await fetch(url);
    let data = await response.json();

    console.log(data);
  });
gcuhipw9

gcuhipw92#

你的 await 不是在一个 async 函数(它在非- async 嵌套在 async 功能),但更大的问题是 getData 正在尝试返回不符合承诺模型的承诺:来自地理位置对象的一系列重复更新。 watchPosition 反复调用它的回调,而不是一次。
javascript对于这种东西没有内置的语义,通常称为“可观察的”(嗯,有) async 迭代器,但我怀疑您可能不希望这样)。这里有图书馆,但如果不是这样,你就必须 getData 接受一个回调,只要有更新就会调用该回调。大致如下:

getData(callback) {
    if (!navigator.geolocation) {
        throw new Error("No geolocation available");
    }
    navigator.geolocation.watchPosition(position => {
        console.log("Latitude is :", position.coords.latitude);
        console.log("Longitude is :", position.coords.longitude);

        var lat = position.coords.latitude;
        var lon = position.coords.longitude;

        const url = `http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=ca148f5dc67f12aafaa56d1878bb6db2`;
        fetch(url)
        .then(response => {
            if (!response.ok) {
                throw new Error(`HTTP error ${response.status}`);
            }
            return response.json();
        })
        .then(result => {
            try {
                callback(result);
            } catch { }
        })
        .catch(error => {
            // ...perhaps handle the error or similar...
        });
    });
}

从名字 getData ,您可能只是想一次性获取当前位置。这就是问题所在 getCurrentPosition 方法。如果是这样,您需要手动创建一个承诺,因为 getCurrentPosition 没有提供一个:

getData() {
    return new Promise((resolve, reject) => {
        if (!navigator.geolocation) {
            reject(new Error("No geolocation available"));
            return;
        }
        navigator.geolocation.getCurrentPosition(position => {
            console.log("Latitude is :", position.coords.latitude);
            console.log("Longitude is :", position.coords.longitude);

            var lat = position.coords.latitude;
            var lon = position.coords.longitude;

            const url = `http://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=ca148f5dc67f12aafaa56d1878bb6db2`;
            resolve(
                fetch(url)
                .then(response => {
                    if (!response.ok) {
                        throw new Error(`HTTP error ${response.status}`);
                    }
                    return response.json();
                })
            );
        });
    });
}

但只有在你只想知道当前位置的情况下。

相关问题