更新异步等待中的值

时间:2018-05-15 09:55:13

标签: javascript async-await

我开发了这一小段代码,用于获取当前的lat和lon,并将它们传递到Google Map URL以获取地图数据。

lat和lon变量最初设置为undefined,然后在调用navigator.geolocation.getCurrentPosition时更新它们的值。此函数确实通过位置对象正确返回数据。然而,不知何故,变量的值不会更新,并且在传递给URL时它们仍未定义。

问题出在哪里?

const getLocationDetails = async () => {

    let lat = undefined;
    let lon = undefined;

    await navigator.geolocation.getCurrentPosition( position => {
        lat = position.coords.latitude;
        lon = position.coords.longitude;
    });
    const res = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lon}`,
        { method: 'GET' });
    const response = await res.json();

};

1 个答案:

答案 0 :(得分:5)

getCurrentPosition没有返回承诺,因此await是一个无操作,并且该函数不会暂停等待操作getCurrentPosition开始完成。当await不是承诺的事情时,执行就会立即继续。

相反,给自己一个启用许可的版本:

const asyncGetCurrentPosition = options => new Promise((resolve, reject) => {
    navigator.geolocation.getCurrentPosition(resolve, reject, options);
});

然后使用它:

const getLocationDetails = async () => {
    let {coords: {latitude, longitude}} = await asyncGetCurrentPosition();
    const res = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`,
        { method: 'GET' });
    // Note: Missing a `res.ok` check here
    const response = await res.json();
};

let {coords: {latitude, longitude}} = ..部分是解构分配,将coords.latitudecoords.longitude放入latitudelongitude我已经更新了fetch以使用latitudelongitude [代替latlon]。也可以使用{ {1}}此处,因为您不会更改constlatitude。风格很重要。)