我有一个Alexa技能,可以获取设备的地址并使用该信息查找附近的设施。根据此解决方案here,这是由于Javascript的异步性。
上述链接问题中提出的解决方案是使用回调将http调用拉入其自己的函数中。我已经这样做了(见下面的代码),但http请求仍未返回。
我还看了@ jfriend00提出的解决方案here。我的回调结构相同。我仍然不明白为什么我的回调在其余代码运行之前没有返回。
getKaiserBuildingHandler()
const getKaiserBuildingHandler = function() {
console.info("Starting getKaiserBuildingHandler()");
...
switch(addressResponse.statusCode) {
case 200:
console.log("Address successfully retrieved, now responding to user.");
...
const nearestKPFacility = getKaiserBuildingHelper(buildingType, address);
...
break;
...
}
console.info("Ending getKaiserBuildingHandler()");
});
...
};

getKaiserBuildingHelper()
const getKaiserBuildingHelper = function(buildingType, address) {
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.";
}
});
}
...
return facilityOutput;
console.info("Ending getKaiserBuildingHelper()");
}

的getJSON()
const getJSON = function(building, callback) {
console.info("Starting getJSON()");
Axios
.get(getFacilitySearchEndpoint(building))
.then(function(response) {
callback(null, response);
})
.catch(function(error) {
callback(error, "ERROR");
});
console.info("Ending getJSON()");
}

getFacilitySearchEndpoint()[维基百科api就像占位符一样]
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()");
}