Javascript Nodejs:使用async/await时如何避免嵌套.then()
下面是我在nodejs中尝试做的事情。RESTAPI将城市名称作为输入。我正在尝试使用输入城市的地理代码API获取纬度和经度然后,使用纬度和经度,我尝试使用另一个API获取最近城市的列表然后,对于所有这些城市,我会得到天气报告,然后对于那些城市,我会得到是否有水,我会将其作为JSON返回 如您所见,有很多这样的方法,本练习的目标是避免嵌套回调 我使用的是async/await,它应该已经消除了嵌套的then函数。但我看不到另一种方法。下面是完整的代码片段。我试图修复的丑陋部分是requester.makeRequest() 以下只是必要代码的一个片段,而不是完整的工作代码。任何关于如何解决这一问题的帮助都将不胜感激Javascript Nodejs:使用async/await时如何避免嵌套.then(),javascript,node.js,Javascript,Node.js,下面是我在nodejs中尝试做的事情。RESTAPI将城市名称作为输入。我正在尝试使用输入城市的地理代码API获取纬度和经度然后,使用纬度和经度,我尝试使用另一个API获取最近城市的列表然后,对于所有这些城市,我会得到天气报告,然后对于那些城市,我会得到是否有水,我会将其作为JSON返回 如您所见,有很多这样的方法,本练习的目标是避免嵌套回调 我使用的是async/await,它应该已经消除了嵌套的then函数。但我看不到另一种方法。下面是完整的代码片段。我试图修复的丑陋部分是requester
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}})
}
})
})
}
})
})
})
app.get('/search',函数(req,res,next){
常量请求程序={
lastRequest:新日期(),
makeRequest:异步函数(url){
const response=等待获取(url);
const json=await response.json();
返回json;
}
};
requester.makeRequest(地理代码\uURL+`?locate=${req.query.q}&json=1`
+地理编码(U令牌)
.然后(职能(城市){
var最终结果=[]
var lat=city.latt;
var long=city.long;
//请求获取该位置附近的城市列表,
//将纬度和经度作为参数
requester.makeRequest(metaweather_url+'?lattlong='10〕
+纬度+','+长)
.then(功能(近距离城市){
var cities\u len=更近的城市长度
对于(i=0;i
我想你还是需要一个
requester.makeRequest(geocode_url +`?locate=${req.query.q}&json=1`
+ geocode_token)
.then(async 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
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
weather = await requester.makeRequest(woeid_url + woeid)
var lattlong = weather.latt_long;
onwater = await awaitrequester.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}})
}
}
})
requester.makeRequest(geocode\uurl+`?locate=${req.query.q}&json=1`
+地理编码(U令牌)
.then(异步函数(城市){
var最终结果=[]
var lat=city.latt;
var long=city.long;
//请求获取该位置附近的城市列表,
//将纬度和经度作为参数
closer_cities=等待请求者。makeRequest(metaweather_url+'?lattlong='+lat+','+long);
var cities\u len=更近的城市长度;
对于(i=0;i
编辑:我真的认为我的答案与你的问题不相关。对不起,那么首先是误用了
,因为它会导致回调地狱。承诺是基于回调的,但它们支持链式链接,链式链接应该可以消除嵌套回调
应该是:
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;
return requester.makeRequest(metaweather_url + '?lattlong='
+ lat + ',' + long)
})
.then(function(closer_cities) {
...
});
如果中有承诺,则应返回该承诺。这样一来,回调嵌套只需要一个级别
await
是then
的语法糖,拒绝也应处理:
app.get('/search', function(req, res, next) {
try {
...
const 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;
const closer_cities = await requester.makeRequest(metaweather_url + '?lattlong='
+ lat + ',' + long);
...
} catch (err) {
next(err)
}
});
调用async
函数时,不应使用。然后(…)
构造…
简单地let result=await myAsynchronousFunction(a、b、c)代码>此行:requester.makeRequest。然后(功能(城市){
替换。然后(函数(城市){
为var city=wait requester。makeRequest
,city
将具有承诺的履行价值,在剩余的中执行此操作,然后
s:
(请记住,await
仅在async
函数中使用,您可以使用iife)
(异步()=>{
var city=wait requester.makeRequest(`${geocode\u url}?locate=${req.query.q}&json=1${geocode\u token}`);
var最终结果=[]
var lat=city.latt;
var long=city.long;
//请求获取该位置附近的城市列表,
//将纬度和经度作为参数
var closer_cities=wait requester.makeRequest(`metaweather_url}?lattlong=${lat},${long});
var cities\u len=更近的城市长度;
对于(i=0;i
如果您使用的是节点请求程序
包,它已被弃用,这将很容易让您使用async/await。请参阅此处的弃用通知:您有什么
(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
}
})
}
}
})();