【发布时间】:2017-11-09 22:32:08
【问题描述】:
我有一项 Alexa 技能,可以获取设备的地址并使用该信息来查找附近的设施。
我查看了@jfriend00 提出的解决方案here。我的回调结构相同。我仍然不明白为什么在其余代码运行之前我的回调没有返回。我应该会看到来自getJSON() 回调的console.info() 调用,但它永远不会运行。
编辑:我显然不明白这个异步的东西是如何工作的,因为我的日志完全不合时宜。有人可以向我解释发生了什么吗?我查看了我链接的解决方案,我的代码看起来与他的准系统解决方案尽可能相似。我不明白我哪里出错了。
控制台日志
getKaiserBuildingHandler()
const getKaiserBuildingHandler = function() {
console.info("Starting getKaiserBuildingHandler()");
...
switch(addressResponse.statusCode) {
case 200:
console.log("Address successfully retrieved, now responding to user.");
const addressObj = addressResponse.address;
const address = `${addressObj['addressLine1']}, ${addressObj['city']}, ${addressObj['stateOrRegion']} ${addressObj['postalCode']}`;
var ADDRESS_MESSAGE = Messages.ADDRESS_AVAILABLE;
const alexa = this;
getKaiserBuildingHelper(buildingType, address, function(response) {
ADDRESS_MESSAGE += response;
alexa.emit(":tell", ADDRESS_MESSAGE);
console.info("Ending getKaiserBuildingHandler()");
});
break;
...
}
});
...
};
getKaiserBuildingHelper()
const getKaiserBuildingHelper = function(buildingType, address, callback) {
console.info("Starting getKaiserBuildingHelper()");
// var facilityOutput = Messages.ERROR;
var facilityOutput = "Inside building helper function, initial value.";
if (buildingType == BLDG_TYPE.PHARMACY ||
buildingType == BLDG_TYPE.CLINIC ||
buildingType == BLDG_TYPE.HOSPITAL) {
...
facilityOutput = "Before get JSON call.";
getJSON(buildingType, function(err, data) {
if (data != "ERROR") {
console.info("Received data from callback: ", data);
facilityOutput = "The closest Kaiser Permanente " + buildingType + " to your location is located at " + data + ".";
} else {
console.error("Error with data received from callback. ", err);
facilityOutput = "Entered JSON call, returned ERROR.";
}
});
}
...
callback(facilityOutput);
console.info("Ending getKaiserBuildingHelper()");
}
getJSON()
const getJSON = function(building, callback) {
console.info("Starting getJSON()");
Axios
.get(getFacilitySearchEndpoint(building))
.then(function(response) {
const responseData = response.data.query.search[0].title;
callback(null, responseData);
console.info("Data retrieved from Axios call");
console.info("Ending getJSON()");
})
.catch(function(error) {
callback(error, "ERROR");
console.info("Error caught from Axios call");
console.info("Ending getJSON()");
});
}
getFacilitySearchEndpoint() [wikipedia api just as placeholder]
const getFacilitySearchEndpoint = function(building) {
console.info("Starting getFacilitySearchEndpoint()");
switch (building) {
case BLDG_TYPE.HOSPITAL:
console.info("Ending getFacilitySearchEndpoint() with " + building);
return "https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&utf8=1&srsearch=Albert+Einstein";
break;
case BLDG_TYPE.PHARMACY:
console.info("Ending getFacilitySearchEndpoint() with " + building);
return "https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&utf8=1&srsearch=Harry+Potter";
break;
case BLDG_TYPE.CLINIC:
console.info("Ending getFacilitySearchEndpoint() with " + building);
return "https://en.wikipedia.org/w/api.php?action=query&format=json&list=search&utf8=1&srsearch=Tony+Stark";
break;
default:
console.info("Ending getFacilitySearchEndpoint() with default");
break;
}
console.info("Ending getFacilitySearchEndpoint()");
}
【问题讨论】:
-
当 Promise Axios Promise 解决后,尝试在
callback(null, response)之后立即移动它 -
虽然理论上它应该按原样触发,但由于 async/promises 的工作方式,顺序错误
-
@djfdev,我刚刚对代码进行了编辑,虽然不是你的建议。我在正确的轨道上吗?
-
我认为您误解了异步的工作原理。在您提供的链接中查看 Felix King 的答案。 TLDR 异步函数(如 Axios 请求和您的
getJSON包装器)立即返回,因此看起来您添加的新回调将出现故障。 -
我明白你在说什么。根据日志,代码返回乱序。我对异步有什么误解?
标签: javascript node.js httprequest axios