最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

的NodeJS:如何避免嵌套。那么()当使用异步 AWAIT

运维笔记admin13浏览0评论

的NodeJS:如何避免嵌套。那么()当使用异步/ AWAIT

的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.makeRequestcity将有承诺的兑现价值,为thens其余做到这一点:

(记住,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
        }
      })
    }
  }

})();
发布评论

评论列表(0)

  1. 暂无评论