Alexa技能中的Firebase呼叫被复制



我有以下处理程序:

'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"

最新更新