我有以下处理程序:
'addTask': function () {
var filledSlots = delegateSlotCollection.call(this);
var taskName = this.event.request.intent.slots.taskName.value;
var starNum = this.event.request.intent.slots.starNum.value;
var usr = this.event.session.user.userId.split(".")[3];
if (taskName && starNum && taskName !== "?" && starNum !=="?"){
db.addTask(usr, taskName, parseInt(starNum), res => {
this.emit(":tell", res);
});
}
},
所有 Firebase 函数都通过输入/输出方法进行了测试,并按预期工作。此函数应将新任务推送到数据库,或者如果存在此类任务,则添加到数量。
这是火力基本代码;
addTask: (user, taskName, stars, cb) => {
var ref = db.ref("users/" + user + "/tasks");
ref.once("value").then(snapshot => {
const data = snapshot.val();
for (var task in data){
if (data[task].name === taskName){
ref.child(task).update({
name: taskName,
stars: stars,
quantity: data[task].quantity + 1
}).then(() => {
cb("This task already exists, and an instance of the task has been added.");
})
}
}
ref.push().set({
name: taskName,
stars: stars,
quantity: 1
}).then(() => {
cb("The task " + taskName + " worth " + stars + " stars has been added!");
})
}, err => console.log(err.code));
},
但是,当通过Alexa使用它时,发现该函数几乎在同一时间被调用了两次(有时三次(。但是,Alexa模拟器只会响应一次,其中包含第二次调用的信息(这将表示它增加了数量(。
知道这是怎么发生的,或者至少有一个黑客解决方案吗?
固定。
事实证明,if (taskName && starNum)
不足以确保这是它最后一次调用意图。需要进行检查以确保request.dialogState
"COMPLETED"
而不是"IN_PROGRESS"
。