Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nodejs:使用async/await时如何避免嵌套.then()_Javascript_Node.js - Fatal编程技术网

Javascript Nodejs:使用async/await时如何避免嵌套.then()

Javascript Nodejs:使用async/await时如何避免嵌套.then(),javascript,node.js,Javascript,Node.js,下面是我在nodejs中尝试做的事情。RESTAPI将城市名称作为输入。我正在尝试使用输入城市的地理代码API获取纬度和经度然后,使用纬度和经度,我尝试使用另一个API获取最近城市的列表然后,对于所有这些城市,我会得到天气报告,然后对于那些城市,我会得到是否有水,我会将其作为JSON返回 如您所见,有很多这样的方法,本练习的目标是避免嵌套回调 我使用的是async/await,它应该已经消除了嵌套的then函数。但我看不到另一种方法。下面是完整的代码片段。我试图修复的丑陋部分是requester

下面是我在nodejs中尝试做的事情。RESTAPI将城市名称作为输入。我正在尝试使用输入城市的地理代码API获取纬度和经度然后,使用纬度和经度,我尝试使用另一个API获取最近城市的列表然后,对于所有这些城市,我会得到天气报告,然后对于那些城市,我会得到是否有水,我会将其作为JSON返回

如您所见,有很多这样的方法,本练习的目标是避免嵌套回调

我使用的是async/await,它应该已经消除了嵌套的then函数。但我看不到另一种方法。下面是完整的代码片段。我试图修复的丑陋部分是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}})
            }
          })
        })
       }
      })
    })
  })
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
如果
中有承诺,则应返回该承诺。这样一来,回调嵌套只需要一个级别

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
        }
      })
    }
  }

})();