的NodeJS:如何避免嵌套。那么()当使用异步/ AWAIT
以下就是我想这样做的NodeJS中。其余的API需要一个城市名作为输入。我试图让使用输入城市地理编码API的经度和纬度。然后,利用纬度和经度,我试图让使用另一个API最接近城市的列表。那么,所有这些城市,我得到的气象报告,那么对于这些城市,我越来越是否有水,我回国这回为一个JSON。
正如你所看到的,有很多的,然后和这个练习的目的是为了避免嵌套的回调。
我使用异步/伺机这应该已经消除了嵌套然后功能。但我没有看到这样做的另一种方式。完整的代码片段如下。丑陋的部分,我想解决的requester.makeRequest()
以下仅仅是一个必要的代码片段,而不是完整的工作代码。如何解开这个任何帮助将不胜感激。
app.get('/search', function(req, res, next) {
const requester = {
lastRequest: new Date(),
makeRequest: async function(url) {
const response = await fetch(url);
const json = await response.json();
return json;
}
};
requester.makeRequest(geocode_url +`?locate=${req.query.q}&json=1`
+ geocode_token)
.then(function(city){
var final_result = []
var lat = city.latt;
var long = city.longt;
// request to get list of cities closer to that location,
//takes latitude and longitude as parameters
requester.makeRequest(metaweather_url + '?lattlong='
+ lat + ',' + long)
.then(function(closer_cities) {
var cities_len = closer_cities.length
for(i = 0; i < closer_cities.length; i++) {
woeid = closer_cities[i].woeid
//request to get weather using woeid parameter
requester.makeRequest(woeid_url + woeid)
.then(function(weather) {
var lattlong = weather.latt_long;
requester.makeRequest(onwater_url+ lattlong +
'?access_token=' + water_access_token)
.then(function(onwater) {
var temp = Object.assign(weather, onwater)
final_result.push(temp)
if (final_result.length == cities_len) {
res.status(200).json({error: false,
data: {message: final_result}})
}
})
})
}
})
})
})
回答如下:
这条线:requester.makeRequest ... .then(function(city){
与.then(function(city){
取代var city = await requester.makeRequest
,city
将有承诺的兑现价值,为then
s其余做到这一点:
(记住,await
只是一个async
函数内部使用,您可以使用iife)
(async () => {
var city = await requester.makeRequest(`${geocode_url}?locate=${req.query.q}&json=1${geocode_token}`);
var final_result = []
var lat = city.latt;
var long = city.longt;
// request to get list of cities closer to that location,
//takes latitude and longitude as parameters
var closer_cities = await requester.makeRequest(`${metaweather_url}?lattlong=${lat},${long}`);
var cities_len = closer_cities.length;
for (i = 0; i < closer_cities.length; i++) {
woeid = closer_cities[i].woeid
//request to get weather using woeid parameter
var weather = await requester.makeRequest(woeid_url + woeid);
var lattlong = weather.latt_long;
var onwater = await requester.makeRequest(`${onwater_url}${lattlong}?access_token=${water_access_token}`);
var temp = Object.assign(weather, onwater)
final_result.push(temp)
if (final_result.length == cities_len) {
res.status(200).json({
error: false,
data: {
message: final_result
}
})
}
}
})();