我想調用Google Maps API並使用結果調用另一個API(這是我的最終目標,現在我只想將結果打印到控制檯)。我的問題是,承諾在API調用之前解決,並最終導致未定義的結果。在異步操作完成之前解決Promise
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;
的谷歌地圖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
};
'new Promise'應該在'getCoords'中完成,而不是'getUserCoords'。異步回調中的'return'不起作用。 – Bergi