首页 > 解决方案 > 如何在 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;

标签: node.jsaws-lambdarxjs

解决方案


这种行为是完全正常的。

所以首先,一个可观察的不是一个承诺,这意味着你不能等待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);
      })

推荐阅读