Amir
Amir

Reputation: 1979

how to wait for a result in rxjs for a lambda function

I am trying to write an async lambda function which is calling a function for sign up a user in cognito. my problem is that in my lambda function, it is not waiting for the result and finish the execution. would you mind check what is my issue? I am new to rxjs. please help me.

mylambda function

exports.handler = async (event, context) => {
         //poolData and params will fetch from event
         let source = await signup(poolData, params);
        console.log(source);
      });

my signup function

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;

Upvotes: 0

Views: 1393

Answers (1)

This behavior is totally normal.

So first thing first, an observable is not a promise which means you are not able to await a response with the await keyword, also I don't see anything to be returned from the signup function, which will probably lead to undefined to be logged anyways.

So how to fix that, one way to fix this issue is to use toPromise() which will turn your observable into a promise which then can be awaited wherever needed.

The other way (which is the rxjs way) will be to return from the signup function the observable and inside your handler function to subscribe for the response.


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);
      })

Upvotes: 2

Related Questions