【问题标题】:how to wait for a result in rxjs for a lambda function如何在 rxjs 中等待 lambda 函数的结果
【发布时间】:2020-07-19 09:36:03
【问题描述】:

我正在尝试编写一个异步 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;

【问题讨论】:

    标签: node.js aws-lambda rxjs


    【解决方案1】:

    这种行为是完全正常的。

    首先,observable 不是一个承诺,这意味着您无法等待带有 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);
          })
    

    【讨论】:

    • 那么在这种情况下,是否建议在这种情况下使用rxjs?我正在考虑尝试使用 rxjs 而不是练习的承诺,但根据你所说的,我需要在加载 rxjs 之上再次使用承诺。另外,我最初以与您编写相同的方式编写代码,但我觉得它很混乱。有没有办法将订阅功能放入注册中并等待结果?
    • 没有办法把订阅放在singup里面,等待解析,在函数外接收通知。 rxjs 的强大功能在您需要组合多个异步操作的情况下大放异彩(您也可以使用 Promise 实现相同的结果,但在某些情况下存在一些缺点)。所以我的建议,尤其是对于编写 rest API 的建议是“如果你没有可以通过(不仅仅是 rxjs)库解决的问题,请不要使用该库”,并且如果最终计划只是为练习然后继续使用 rxjs,一开始可能看起来很混乱..
    • 但是在某些时候,当您创建一些工厂函数来处理常见情况并减少样板时,它会看起来很漂亮和简单。
    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2019-12-12
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多