Node.js 如何在rxjs中等待lambda函数的结果
我正在尝试编写一个异步lambda函数,它调用一个函数来在cognito中注册用户。 我的问题是,在lambda函数中,它没有等待结果并完成执行。你介意检查一下我的问题是什么吗?我是rxjs的新手。请帮帮我 mylambda函数Node.js 如何在rxjs中等待lambda函数的结果,node.js,aws-lambda,rxjs,Node.js,Aws Lambda,Rxjs,我正在尝试编写一个异步lambda函数,它调用一个函数来在cognito中注册用户。 我的问题是,在lambda函数中,它没有等待结果并完成执行。你介意检查一下我的问题是什么吗?我是rxjs的新手。请帮帮我 mylambda函数 exports.handler = async (event, context) => { //poolData and params will fetch from event let source = await signu
exports.handler = async (event, context) => {
//poolData and params will fetch from event
let source = await signup(poolData, params);
console.log(source);
});
我的注册功能
function signup(poolData, body) {
const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
const { username, password, attributes } = body;
const attributesList = [];
if (Array.isArray(attributes)) {
attributesList.push(
...attributes.map(item => new AmazonCognitoIdentity.CognitoUserAttribute(item))
);
}
let source = Observable.create(observer => {
let output = (err, res) => {
if (err)
{
observer.error(err);
}
else
{
const cognitoUser = res.user;
const data = {
username: cognitoUser.getUsername(),
};
observer.next(data);
}
observer.complete();
}
userPool.signUp(username, password, attributesList, null, output);
});
let respond;
let subscriber = {
next(value) {
console.log('Subscriber - next: ', value);
respond = {
'statusCode': 200,
'body': JSON.stringify({
"username": value.username,
})
}
}, error(err) {
console.log('Subscriber - err: ', err);
respond = err;
},
complete() {
console.log('Subscriber - complete');
return response;
}
};
source.subscribe(subscriber);
}
module.exports = signup;
这种行为是完全正常的 所以首先,一个可观察的不是承诺,这意味着你不能用
await
关键字等待响应,而且我看不到从signup
函数返回任何东西,这可能会导致未定义的被记录
因此,如何解决这个问题,解决这个问题的一种方法是使用toPromise()
,它将把你的观察转化为承诺,然后在需要的地方等待
另一种方法(即rxjs方法)是从注册
函数返回可观察的,并在处理程序
函数中订阅响应
让订户={
下一个(值){
log('Subscriber-next:',值);
答复={
“状态代码”:200,
“body”:JSON.stringify({
“用户名”:value.username,
})
}
},错误(err){
log('Subscriber-err:',err);
回应=错误;
},
完成(){
console.log('Subscriber-complete');
返回响应;
}
};
exports.handler=(事件、上下文)=>{
//poolData和params将从事件获取
注册(池数据,参数)。订阅(订户);
})
在这种情况下,是否建议在这种情况下使用rxjs?我想尝试使用rxjs,而不是实践承诺,但根据你所说的,我需要在加载rxjs的基础上再次使用承诺。另外,我最初编写代码的方式与您编写代码的方式相同,但我觉得它很凌乱。有没有办法将subscribe函数放在注册内并等待结果?没有办法将subscribe函数放在singup
内,等待它被解决,并在函数外接收通知。在需要组合多个异步操作的情况下,rxjs的强大功能会大放异彩(您也可以通过承诺获得相同的结果,但在某些情况下会有一些缺点)。因此,对于编写rest API,我的建议是“如果你没有(不仅仅是rxjs)库可以解决的问题,就不要使用该库”,如果最终计划只是为了制作一个应用程序进行练习,那么继续使用rxjs,一开始它可能看起来很混乱,但在某些时候,当你创建一些工厂函数来处理常见的情况并减少样板文件时,它会看起来漂亮而简单。