- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一项 Alexa 技能,可以获取设备的地址并使用该信息找到附近的设施。
我看过解决方案here正如@jfriend00 所提议的那样。我的回调的结构相同。我仍然不明白为什么在其余代码运行之前我的回调没有返回。我应该从 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() [维基百科 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()");
}
最佳答案
我在聊天中留下了一些笔记,但这里的事情可能更清楚。一定要再看一下 Felix 在您提供的链接中的回答,但是由于您在这里有很多代码,如果我在这种情况下进行解释,将会更容易理解。
Axios.get
是异步的,这意味着它实际上在 HTTP 请求完成之前返回。因此,getJSON
主体中在您发出请求后发生的任何事情,实际上都会在传递给 then
或 catch
的函数被调用之前发生:
function getJSON (url, callback) {
Axios
.get(url)
.then(function (data) {
console.log('I happen later, when the request is finished')
callback(null, data)
})
.catch(function (err) {
console.log('I happen later, only if there was an error')
callback(err)
})
console.log('I happen immediately!')
}
很容易混淆——在异步代码中,事情不一定按照它们在代码中出现的顺序发生。所以我们在调用异步函数的时候要注意这一点。
这意味着 getKaiserBuildingHelper
函数内部存在问题。因为您的 getJSON
函数只是 Axios promise 的回调式包装器,所以它也是异步的。它会在请求完成之前立即返回,函数体内的其余代码将继续正常运行。
function getKaiserBuildingHelper (callback) {
let facilityOutput = 'initial value'
getJSON('http://some-url.com', function (err, data) {
console.log('I happen later, when the request is complete')
if (err) {
facilityOutput = 'Error!'
} else {
facilityOutput = 'Success!'
}
})
console.log('I happen immediately!')
callback(facilityOutput)
}
这意味着最后一行 callback(facilityOutput)
发生在 getJSON
回调之前。因此,facilityOutput
的值保持不变。但是您可以通过将回调移动到 getJSON
回调中来轻松解决此问题:
function getKaiserBuildingHelper (callback) {
getJSON('http://some-url.com', function (err, data) {
if (err) {
callback('Error!')
} else {
callback('Success!')
}
})
}
现在您可以按预期使用该函数了:
getKaiserBuildingHelper(function (message) {
console.log(message) // => 'Success!' or 'Error!'
}
最后,我不确定您为什么要将 this.emit
添加到该回调中。那是从其他地方复制粘贴的东西吗?
关于javascript - 未调用 Amazon Alexa 技能回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47212727/
Ai时代的产品经理 随着人工智能(AI)的飞速发展,AI已经从一个前沿技术概念逐步演变为驱动各行业创新的核心力量。从智能助手到自动驾驶,从个性化推荐系统到图像识别,AI正在以不可思议的速度改变着
我在我的 Azure 帐户上创建并部署了 Node.js 机器人。我还添加了 Cortana channel ,并启用了通过连接服务管理用户身份和请求用户个人资料数据(此处我有 User.Info.E
上个学期我介绍了 Java 中的面向对象编程,下学期我将学习 Java 计算机科学 2,它基本上学习用 Java 实现的各种算法和数据结构,例如链表、二叉树等。 ..我可以通过哪些方法来巩固在面向对象
我想在网站中添加水平滑动效果。这更像是网站中的“我们是谁”、“我们的技能”、“我们的服务”、“我们的投资组合”:http://markline.org/或者类似于 http://greenacrein
我是一名 C++ 开发人员(主要是 ATL/COM 的东西),直到 2001 年我和我们中的许多人一样转向 C#。从那时起我就没有做过太多 C++ 编程。 关于如何重振我的 C++ 技能,您有什么建议
即使代码必须由 dba 授权或创建,创建表和索引等对象也是必不可少的。有经验的开发人员应该注意哪些其他通常由 dbas 执行的领域? 最佳答案 开发人员有责任尽一切努力使他的代码a)正确并且b)快速。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
食物语宫保鸡丁 获得方式 1、玩家通过限时食魂召唤活动中抽取的方式获得宫保鸡丁。 2、玩家通过主线关卡有几率掉落不同品质的宫保鸡丁。 3、玩家可以使用100个宫保鸡丁信物兑换宫保鸡丁食魂。
白狼属性 阴阳师白狼40级后,各项属性基本上就是一个输出式神的正常数值,攻击有3000,生命防御会比辅助类的式神低一些,速度暴击都是S。 白狼技能分析 【文射】:普通攻击,白狼射出注入了妖
我需要修改我发布的 Alexa 技能。我熟悉亚马逊在发布技能后自动创建的“开发中”技能版本。我不明白的是我如何迭代我的技能,特别是当我需要同时更改交互模型和链接的 Lambda 函数时? 例如,我可以
我想知道是否可以使用 papertrail 实现以下用例 gem ? 维基百科类型的应用程序,其 wiki 页面登录的用户可以更改/编辑,其中: 版主可以撤消特定更改: 我知道 papertrail
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭10 年前。 Improv
我正在创建 Alexa 技能,我已经编写了几个自定义和默认 intent ,并且它们工作正常。 现在我想写一个后备 intent ,其中我想获得询问/发送到 Alexa 技能的确切语句,有没有一种方法
我正在学习 js 并创建简单的 Alexa 技能。我想更好地理解模板代码,我正在研究 https://ask-sdk-for-nodejs.readthedocs.io 上的文档但我找不到这个问题的答
我在美国和德国成功发表了我的第一项技能。在扩展到更多区域时,我遇到了无法在 DE 中重现的帐户链接问题。 在触发认证之前,是否有在多个国家/地区进行有效测试的最佳实践。到目前为止,我读到你应该更改亚马
设置完所有内容后,我在 Alexa 开发人员中测试技能时遇到此错误 请求技能的响应有问题,然后我将该 json 响应放入 lambda 测试中,得到以下结果 { "errorType": "TypeE
我希望能够通过我的 Alexa 技能运行内置或第三方技能。例如,我希望能够说 “Alexa,开始午睡” 并让 Alexa 关闭所有灯,启动特定的 Tune-In 电台,并设置 30 分钟的闹钟。但是我
我已经在我的技能中添加了 APL 支持,但现在我不明白如何检查设备是否有显示屏并因此支持 APL。在 Node.js 中看起来很简单,但 Python (3.7) 一直让我发疯。我已经尝试过提到的方法
我正在做 Hyperskill 加密 - 解密项目,描述如下,我遇到了问题。例如,如果我尝试加密字母 = a key = 1,则效果很好,输出将是:b。但如果 letter = z, key = 1,
我正在制作一个返回音频但仅持续 x 秒的函数。 如果用户说 给我放一首歌 x 秒 我正在播放歌曲,但需要在 X 秒后取消播放。因此,我的计划是在运行音频之前启动计时器 x 秒。然后,一旦计时器到时,就
我是一名优秀的程序员,十分优秀!