Wednesday, 3 May 2017

Promise is resolved before async operation completes

I want to make a call to a Google Maps API and use the result to call another API (that is my eventual goal, right now I just want to print the results to the console.) My problem is that the promise resolves before the API call and I end up with a result of undefined.

routes.js

const express = require('express');
const router = express.Router();
const geospacial = require('./geospacial.js');
const trailapi = require('./trailapi.js');

router.get('/', (req, res, next) => {
  res.render('index');
});

router.post('/', (req, res, next) => {
  let activity = req.body.activity;
  let radius = req.body.radius;

  let getUserCoords = new Promise((resolve,reject) => {
    let userCoords = geospacial.getCoords(req.body.zip);
    resolve(userCoords);
  });

  getUserCoords.then((result) => {
    console.log("data: " + result);
  });
});
module.exports = router;

The Google Maps API (geospacial.js)

const https = require('https');
require('./env.js');  // comment out for production

// Source: https://gist.github.com/clauswitt/1604972
const getDistance = (start, end) => {
  const earthRadius = 6371.008;
  let lat1 = parseFloat(start.latitude);
  let lat2 = parseFloat(end.latitude);
  let lon1 = parseFloat(start.longitude);
  let lon2 = parseFloat(end.longitude);

  let dLat = (lat2 - lat1) * Math.PI / 180;
  let dLon = (lon2 - lon1) * Math.PI / 180;
  lat1 = lat1 * Math.PI / 180;
  lat2 = lat2 * Math.PI / 180;

  let a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
          Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
  let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  let d = earthRadius * c;
  let kilometers = Math.round(d * Math.pow(10, 2)) / Math.pow(10, 2);
  let miles = Math.round(kilometers * .621371);
  console.log(miles);
  return miles;
};

// getDistance({latitude: 39.72122192, longitude: -80.51956177},{latitude: 40.02198029, longitude: -79.90330505}); // for testing

const getCoords = (addressData) => {
  let body = '';
  let req = https.get('https://maps.googleapis.com/maps/api/geocode/json?address=' + addressData + '&key=' + process.env.googleAPIKey, function(res) {
    res.on('data', function(data) {
      body += data;
    });
    res.on('end', function() {
      let result = JSON.parse(body);
      let coords = result.results[0].geometry.location;
      console.log(coords);
      return coords;
    });
  });

  req.on('error', function(e) {
    console.error(e);
  });
};
// getCoords('15351');  // for testing

module.exports = { 
  getCoords: getCoords,
  getDistance: getDistance
};



via SmellydogCoding

No comments:

Post a Comment