javascript - AWS Lambda Node.js 在 promise 中执行 this.emit

标签 javascript promise aws-lambda alexa alexa-skills-kit

我最近一直在使用 node.js 在 Lamda 内部开发 Alexa。我必须实现 promise 以确保请求以正确的顺序发生并等待数据库查询完成。我确实可以正常工作,但现在我无法从 promise 中执行任何“this.emit”语句,这可能是由于 promise 结构将“this”用于其自身目的。

如有任何帮助,我们将不胜感激!这与以下线程非常相似:AWS Lambda Node.js execute this.emit after async HTTP request completes

我会在那里发表评论,但没有代表,DOH!无论如何,这是代码。 emit 语句靠近底部。提前致谢!

    'LaunchRequest': function() {
    var accessToken = this.event.session.user.accessToken;
    // Check for User Data in Session Attributes
    if (accessToken) {
        // Get User Details from Login with Amazon
        AmazonAPI('https://api.amazon.com/user/profile?access_token=', accessToken, 'GET')
            .then(function(userDetails) {
                console.log(userDetails);
                return (userDetails);
            })
            .then(function(userDetails) {
                console.log('STEP 2: Starting DB Lookup');
                var email = userDetails.email;
                return userCheck(email);
            })
            .then(function(userDetails) {
                var noAccount = '{"Items":[],"Count":0,"ScannedCount":0}';
                var existString = JSON.stringify(userDetails);
                var activeState = existString.includes("ACTIVE");
                var linkState = existString.includes("linkComplete");
                console.log(linkState);
                var truth = true;
                if (existString == noAccount) {
                    return AmazonAPITwo('https://api.amazon.com/user/profile?access_token=', accessToken, 'GET')
                        .then(function(userDetails) {
                            console.log(userDetails);
                            var name = userDetails.name;
                            var email = userDetails.email;
                            var postal_code = userDetails.postal_code;
                            var amazonId = userDetails.user_id;
                            var currentState = userDetails.state;
                            var state = "linkComplete";
                            return userCreate(accessToken, email, name, amazonId, postal_code, state);
                        })
                        .then(function() {
                            console.log('Staring PhaseOne Questions');
                            this.emit('phaseOne');

                        });
                } else if (activeState == truth) {
                    console.log('Saying Fact');
                    this.emit('giveFactIntent');
                } else if (linkState == truth) {
                    console.log('Staring PhaseOne Questions');
                    this.emit('phaseOne');
                }
            })
            .catch(function(err) {
                console.log('Caught Error:', err);
            });
    } else {
        // Account Not Linked
        this.emit(':tellWithLinkAccountCard', 'Welcome!  ');
    }
},

最佳答案

保留对此的引用以备后用:

const that = this; // at the top

// later on in nested function
that.emit();

关于javascript - AWS Lambda Node.js 在 promise 中执行 this.emit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48211086/

相关文章:

javascript - AWS Lambda 无法连接到 RDS 实例,但我可以在本地连接?

amazon-web-services - aws cli 列出 lambda 应用程序

javascript - Kendo 日期选择器不可编辑

javascript - 防止退格键在 AngularJS 中导航回来

Javascript Promise - fonfaceobserver + 变量

javascript - 网络抓取和 promise

node.js - Lex 聊天机器人错误 : Reached second execution of fulfillment lambda on the same utterance

javascript - 在扩展面板上选择 radio 会更改另一个组件 vuetify 中的属性

javascript - 如何在悬停时制作 gif 动画,悬停后恢复正常

javascript - 如何记录 AWS Amplify API.get 请求以查看 url 上的 queryStringParameters