编辑 - 此问题已标记为this question的副本,但不是。我的问题不是"如何从异步函数获得响应"。我的问题是我试图使用该问题中解释的解决方案之一(使用回调),但我的回调中必须有错误的功能,我无法弄清楚哪个。
作为JS和Node的新手,我尝试将像Google Maps这样的API合并到botkit bot中。在阅读了关于回调和观看一些视频的大量SO问题之后,我开始计算回调,但在下面的情况下,回调仍然未返回未定义,我无法弄清楚原因。我已将Google地图调用置于回调函数中,然后在机器人听到相应的消息时调用该函数。
给出mapIt函数:
let mapIt = function(queryString) {
const mapsApiKey = 'THE_API_KEY';
const googleMapsClient = require('@google/maps').createClient({
key: mapsApiKey
});
googleMapsClient.geocode({
address: queryString
}, function(err, response) {
if (!err) {
formattedAddress = response.json.results[0]['formatted_address'];
//console.log(formattedAddress);
return formattedAddress;
} else {
return 'Maps API Error';
}
});
};
调用函数:
let getMapsResult = function(suppliedString, callback) {
return callback(suppliedString);
};
似乎我应该能够使用mapIt的返回值,如下所示:
controller.hears(
['\\b.*what is the formatted address of\s*([^\n\r?]*)'], ['direct_message', 'direct_mention', 'mention'],
function (bot, message) {
let queryLocation = message.match[1];
bot.say(message, getMapsResult(queryLocation, mapIt));
});
任何人都可以帮助我理解为什么我仍然会undefined
拨打mapIt
?
编辑 - 我尝试在bot.say()
函数中调用googleMapsClient.geocode()
,但没有任何反应。但是,console.log会记录Google地图响应:
googleMapsClient.geocode({
address: queryString
}, function(err, response) {
if (!err) {
formattedAddress = response.json.results[0]['formatted_address'];
console.log(formattedAddress);
bot.say(message, formattedAddress);
} else {
return 'Maps API Error';
}
});
调用getMapsResult ...
controller.hears(
['\\b.*what time is it in\s*([^\n\r?]*)', '\\b.*what\'s the time in\s*([^\n\r?]*)'], ['direct_message', 'direct_mention', 'mention'],
function (bot, message) {
let queryLocation = message.match[1];
getMapsResult(queryLocation, mapIt);
});