Javascript 在异步操作完成之前解析承诺
我想调用Google Maps API,并使用结果调用另一个API(这是我的最终目标,现在我只想将结果打印到控制台)。我的问题是,在API调用之前,承诺解决了,结果是未定义 routes.jsJavascript 在异步操作完成之前解析承诺,javascript,node.js,es6-promise,Javascript,Node.js,Es6 Promise,我想调用Google Maps API,并使用结果调用另一个API(这是我的最终目标,现在我只想将结果打印到控制台)。我的问题是,在API调用之前,承诺解决了,结果是未定义 routes.js const express = require('express'); const router = express.Router(); const geospacial = require('./geospacial.js'); const trailapi = require('./trailapi.
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)
getCoords有一个异步调用,因此您需要在getCoords返回值之前解析承诺。您需要解析异步函数回调中的承诺
让getUserCoords=geospacial.getCoords(req.body.zip)代码>
getCoords有一个异步调用,因此您需要在getCoords返回值之前解析承诺。您需要解析异步函数回调中的承诺
让getUserCoords=geospacial.getCoords(req.body.zip)代码>
什么getCoords
不返回承诺,因此它不起作用。
也许你可以这样改变它:
const getCoords = (addressData) => {
return new Promise((resolve, reject) => {
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);
resolve(coords);
});
});
req.on('error', function(e) {
console.error(e);
reject(e)
});
})
};
什么getCoords
不返回承诺,因此它不起作用。
也许你可以这样改变它:
const getCoords = (addressData) => {
return new Promise((resolve, reject) => {
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);
resolve(coords);
});
});
req.on('error', function(e) {
console.error(e);
reject(e)
});
})
};
您的getCoords
函数有一个缺陷:它从不返回任何内容。永远
https.get
是异步的,req.on
也是异步的。因此,您在getCoords
中执行了两个异步操作,但从未返回任何内容
您可能认为'end'
事件处理程序中的return语句为getCoords
返回,但它没有返回。事件处理程序中的返回为事件处理程序函数返回(在“res.on('end',
”之后启动的函数)
别担心,你走的是正确的道路;使用承诺
const getCoords = (addressData) => {
return new Promise((resolve, reject) => {
// do your stuff
// when you want to return a value, resolve:
resolve(apiResponse);
});
};
现在getCoords
将返回一个承诺
打印响应的代码现在应该有点像这样:
geospacial.getCoords(req.body.zip).then((result) => {
console.log("data: " + result);
});
哪个
调用geospacial.getCoords
调用生成的承诺
的然后
(最终)解决并打印出您的结果
您的getCoords
函数有一个缺陷:它从不返回任何内容
https.get
是异步的,req.on
也是异步的。因此,您可以在getCoords
中执行两个异步操作,但从不返回任何内容
您可能认为'end'
事件处理程序中的return语句为getCoords
返回,但它没有返回。事件处理程序中的返回为事件处理程序函数返回(在“res.on('end',
”之后启动的函数)
别担心,你走的是正确的道路;使用承诺
const getCoords = (addressData) => {
return new Promise((resolve, reject) => {
// do your stuff
// when you want to return a value, resolve:
resolve(apiResponse);
});
};
现在getCoords
将返回一个承诺
打印响应的代码现在应该有点像这样:
geospacial.getCoords(req.body.zip).then((result) => {
console.log("data: " + result);
});
哪个
调用geospacial.getCoords
调用生成的承诺
的然后
(最终)解决并打印出您的结果
新承诺
应该在getCoords
中执行,而不是在getUserCoords
中执行。异步回调中的返回
无效。新承诺
应该在getCoords
中执行。异步回调中的返回
无效。您可以return
在安装错误处理程序之前。最好将其放入promise executor回调中,并在发生时将其放入promise executor回调中。这正是我所需要的。谢谢!我仍在试图绕开promises。在安装错误处理程序之前,请将其放入promise executor调用中。最好将其放入promise executor调用中回来,当它发生时,拒绝
。这正是我所需要的。谢谢!我仍在努力把我的头绕在承诺上。