Nodejs for for循环中对api的非异步调用

时间:2016-04-05 12:48:38

标签: node.js

对于学校作业,我必须创建一个执行api调用的循环并将这些结果添加到数组中。我如何在Node JS中做到这一点?

我的代码的作用说明: 该函数获取宠物小精灵的所有位置。 当1公里范围内少于10个口袋妖怪时 它添加了剩余的口袋妖怪。所以你总是至少有10个口袋妖怪附近。 在那些添加过程中,它必须得到一个随机口袋妖怪的随机位置。 使用pokeapi(.co)通过随机整数(最大720)完成随机 最终结果仍将是所有口袋妖怪的列表。无论你是否需要添加一些,都可以。

问题是我不知道如何为每个'toAdd做api调用。并将它们添加到数组中。默认情况下它是异步。

下面我添加了我当前的代码,几条评论描述了我需要的内容。

router.get('/', function(req, res) {
  var startDate = new Date();

  if (!req.query.lat || !req.query.lng) {
    res.status(400).json("Your location has not been included");
  }

  var lat = parseFloat(req.query.lat);
  var lng = parseFloat(req.query.lng);

  location.count({}, function(err, count) {
    console.log(count);
  });

  location.find({}).exec(function(err, locations) {
    if (err) {
      return next(err);
    }

    var filteredlocations = [];
    locations.forEach(function(fetchedLocation) {
      distance = calcDistance(fetchedLocation.lat, fetchedLocation.lng, lat, lng);
      if (distance < 1000) {
        filteredlocations.push(fetchedLocation);
      }
    });

    if (filteredlocations.length < 10) {
      var toAdd = 10 - filteredlocations.length;
      console.log(toAdd);

      var newlocations = [];
      for (var i = 0; i < toAdd; i++) {
        var randomlocation = randomLocation(lat, lng);

        // random id = random
        var pokemon;
        var options = {
          host: 'pokeapi.co',
          port: 80,
          path: '/api/v2/pokemon/?limit=720',
          method: 'GET'
        };

        // This needs to fill the pokemon at a non-async method
        http.get(options, function(response) {
          var content = '';

          response.on('data', function(chunk) {
            content += chunk;
          });

          response.on('end', function() {
            var object = JSON.parse(content);

            pokemon = {
            {
              "pid": object.id,
              "name": object.name
            })
          });
        });

        var newlocation = //new location({
          {
            "lat": randomlocation.lat,
            "lng": randomlocation.lng,
            "pid": pokemon.pid,
            "name": pokemon.name,
          };

        newlocations.push(newlocation);
      }

      location.collection.insert(newlocations, function(err, docs) {
        if (err) {
          console.log("err: " + err);
        } else {
          docs.ops.forEach(function(doc) {
            locations.push(doc);
          });
          return res.json(locations);
        }
      });
    } else {
      console.log('niets toegevoegd');
      return res.json(dlocations);
    }
  });
});

0 个答案:

没有答案