node.js - 如何在 rxjs 中等待 lambda 函数的结果
问题描述
我正在尝试编写一个异步 lambda 函数,该函数正在调用一个用于在 cognito 中注册用户的函数。我的问题是在我的 lambda 函数中,它没有等待结果并完成执行。你介意检查一下我的问题吗?我是 rxjs 的新手。请帮我。
mylambda 函数
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
函数返回任何东西,这可能会导致undefined
被记录。
那么如何解决这个问题,解决这个问题的一种方法是使用toPromise()
它将你的 observable 变成一个 Promise,然后可以在任何需要的地方等待它。
另一种方式(即 rxjs 方式)是从signup
函数返回 observable 并在handler
函数内部订阅响应。
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;
}
};
exports.handler = (event, context) => {
//poolData and params will fetch from event
signup(poolData, params).subscribe(subscriber);
})
推荐阅读
- asp.net-mvc - NET Core MVC - 外部 API 生产速度慢
- arrays - 如何将数字 7 和更小的数字添加到数组中?
- python - 我正在尝试使用 python (flask) 在 Flutter 中建立连接作为后端
- laravel - 如何从 Laravel 的数据透视表中添加资源类中的列
- node.js - Angular 10 SSR 和 expressjs 会话
- google-cloud-platform - 数据流作业 GCS 到 Pub/sub 最大批量大小
- python - matplotlib图中子图的子图
- c# - Newtonsoft c#将所有JArray转换为对象数组
- sql-server - 确定两个日期之间是否存在值
- python - 在python中将CSV解析为模板