Javascript jQuery调用.GET()两次并获取结果

Javascript jQuery调用.GET()两次并获取结果,javascript,jquery,http,async-await,get,Javascript,Jquery,Http,Async Await,Get,在我的程序中,我需要进行GET调用,然后将返回的数据传递给另一个GET调用,然后返回结果。当它发生时,我希望我的程序等待数据返回 现在我想到了这样的事情: async function getPlaceTag(lat, lng) { jQuery.get('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng) .d

在我的程序中,我需要进行GET调用,然后将返回的数据传递给另一个GET调用,然后返回结果。当它发生时,我希望我的程序等待数据返回

现在我想到了这样的事情:

    async function getPlaceTag(lat, lng) {
        jQuery.get('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng)
            .done(function (data) {
                jQuery.get('http://overpass-api.de/api/interpreter?data=[out:json];way(' + data.osm_id + ');out;')
                    .done(function (data2) {
                        console.log(data2);
                    });
            });
    }
async function getPlaceTag(lat, lng) {
    const data1 = await fetchText('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng);
    return fetchText('http://overpass-api.de/api/interpreter?data=[out:json];way(' + data1.osm_id + ');out;')
}
然后我用它:

    mymap.on('moveend', async function () {
        let coords = myMarker.getLatLng();
        console.log('call tag');
        await getPlaceTag(coords.lat, coords.lng);  // I want to wait here until it gets done
        console.log('after call');
    })
我得到:

call tag
after call
[GET data]    <-- printed my data after ~1sec

您需要
返回
等待
调用
完成
的结果,以便让
异步
函数等待它完成

使用
.then
(而不是
.done
)和非
异步
功能:

function getPlaceTag(lat, lng) {
    return jQuery.get('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng)
        .then(function (data) {
            return jQuery.get('http://overpass-api.de/api/interpreter?data=[out:json];way(' + data.osm_id + ');out;')
                .then(function (data2) {
                    return data2;
                });
        });
}
async function fetchText(url, init) {
    const response = await fetch(url, init);
    if (!response.ok) {
        throw new Error("HTTP error " + response.status);
    }
    return response.text();
}
async
函数与
wait
return
一起使用:

async function getPlaceTag(lat, lng) {
    const data1 = await jQuery.get('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng);
    return jQuery.get('http://overpass-api.de/api/interpreter?data=[out:json];way(' + data1.osm_id + ');out;');
}
请注意,在这两种情况下,jQuery都是有效的,因为jQuery被更新为使其
延迟
成为有效的承诺


FWIW,我不会为此使用jQuery,我会使用标准的
fetch
isntead。我有一个实用功能:

function getPlaceTag(lat, lng) {
    return jQuery.get('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng)
        .then(function (data) {
            return jQuery.get('http://overpass-api.de/api/interpreter?data=[out:json];way(' + data.osm_id + ');out;')
                .then(function (data2) {
                    return data2;
                });
        });
}
async function fetchText(url, init) {
    const response = await fetch(url, init);
    if (!response.ok) {
        throw new Error("HTTP error " + response.status);
    }
    return response.text();
}
然后像这样使用它:

    async function getPlaceTag(lat, lng) {
        jQuery.get('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng)
            .done(function (data) {
                jQuery.get('http://overpass-api.de/api/interpreter?data=[out:json];way(' + data.osm_id + ');out;')
                    .done(function (data2) {
                        console.log(data2);
                    });
            });
    }
async function getPlaceTag(lat, lng) {
    const data1 = await fetchText('https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=' + lat + '&lon=' + lng);
    return fetchText('http://overpass-api.de/api/interpreter?data=[out:json];way(' + data1.osm_id + ');out;')
}
类似地,我有
fetchJSON
,当我需要读取结果并将其解析为JSON时,等等

我不只是直接使用
fetch
,因为:即使出现HTTP错误(如404或500),它也会履行承诺,而不是拒绝它



这是我贫血小博客上的一篇文章。

效果很好,感谢所有的解决方案!