我最近一直在使用node.js在Lamda内部工作。我必须实现promises以确保请求以正确的顺序发生并等待数据库查询完成。我确实有这个工作,但是现在我无法在promise中执行任何“this.emit”语句,这可能是由于使用“this”的promise结构用于它自己的目的。
任何帮助将不胜感激!这与以下主题非常相似: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! ');
}
},
答案 0 :(得分:1)
保留对此的引用以便稍后使用:
const that = this; // at the top
// later on in nested function
that.emit();