我有以下处理程序:
'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功能都通过输入/输出方法进行测试,并按预期工作。期望此功能将新任务推送到数据库,或者如果存在此任务则添加到数量。
以下是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模拟器只响应第二次调用的信息(可以说它添加到数量中)。
知道这是怎么回事,或者至少有一个hacky解决方案?
答案 0 :(得分:0)
固定。
结果if (taskName && starNum)
不足以确保它是最后一次调用意图。需要检查以确保request.dialogState
为"COMPLETED"
而不是"IN_PROGRESS"
。