将回调传递给事件处理程序

时间:2017-02-26 06:34:43

标签: node.js aws-lambda alexa-skills-kit alexa-skill

我正在使用在AWS Lambda中运行的Node中的Alexa技能,并且在发出事件时无法获得回调执行。 Node.JS README的Alexa-skills-kit演示了如何将回调函数传递给事件处理程序,并建议使用箭头函数来保留上下文:

if(!account_id) {
    console.log('Access token:' + accessToken);
    this.emit('getAccount', accessToken, function (retrieved_id) {
        console.log('account id in callback: ' + retrieved_id);
        this.emit('welcome');
    });
}

我试图这样做,但发现我的回调似乎永远不会被执行。我认为这是因为AWS Lambda仅限于Node 4.3.2,并且箭头功能不可用,所以我尝试将这个上下文以旧式方式传回回调:

在新会话处理程序中:

accountHandler = {
    'getAccount': function (accessToken, cb) {
        console.log('fetching account id');
        var client = thirdparty.getClient(accessToken);
        var r = client.getAccountForToken(client);
        r.then(function (data) {
            console.log('got it:' + data);
            this.attributes['account_id'] = data;
            cb.call(this, data);
        }).catch(function (err) {
            this.emit('handleApiError', err);
        });
    },
}

在事件处理程序中:

npm start

我可以看到我在日志中成功检索了帐户ID,但Lambda正在执行而没有错误,也没有调用我的回调函数。我试图弄清楚在Promise中调用回调是否有问题然后'功能,或者是否有其他事情发生。

1 个答案:

答案 0 :(得分:0)

确切的问题是承诺然后功能缺乏上下文。我通过使用getAccount处理程序中的箭头函数来修复此问题:

value = {v: k for k, v in TYPES}['Option3']

当然这也表明Lambda Node.JS函数支持箭头函数就好了。