Javascript jQuery调用.GET()两次并获取结果
在我的程序中,我需要进行GET调用,然后将返回的数据传递给另一个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
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),它也会履行承诺,而不是拒绝它
这是我贫血小博客上的一篇文章。效果很好,感谢所有的解决方案!