Node.js 如何在rxjs中等待lambda函数的结果

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

我正在尝试编写一个异步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
函数返回任何东西,这可能会导致
未定义的
被记录

因此,如何解决这个问题,解决这个问题的一种方法是使用
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,一开始它可能看起来很混乱,但在某些时候,当你创建一些工厂函数来处理常见的情况并减少样板文件时,它会看起来漂亮而简单。