首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当xstate调用promise时,AWS lambda实例关闭

当xstate调用promise时,AWS lambda实例关闭
EN

Stack Overflow用户
提问于 2020-03-07 22:23:32
回答 3查看 256关注 0票数 1

我有一个lambda函数,它使用xstate按顺序执行某些任务,其中一个步骤是将数据保存到dynamo db。但我的lambda在执行下面这行代码后立即结束执行。

代码语言:javascript
复制
const response = await new DynamoDB.DocumentClient().put(params).promise();

我的代码:

代码语言:javascript
复制
import {Handler} from "aws-lambda";
import {interpret} from 'xstate';
import { Machine} from "xstate";
import {PutItemInput} from "aws-sdk/clients/dynamodb";
import {DynamoDB} from "aws-sdk";

export const recordProcessor: Handler = async (event) => {
  console.log('records size----->', event.Records.length);
  for (const record of event.Records) {
      const body = JSON.parse(record.body);
      console.log('body ----->', body);

    interpret(Machine({id:'test',
      context:body,
      initial: 'start',
      states:{
        start: {
          invoke: {
            src: context => initiate(context),
            onDone: {
              target: 'success'
            }
          }
        },
        success: {
          type: 'final'
        }
      }
    })).onTransition(state => {
      if (state.changed) {
        console.log('state ----> ', state.value);
      }
    }).onDone(() => console.log('done--->')).start();
  }


  async function initiate(context: any) {
    console.log('DbDynamoImpl ::: insert ::: start :::');
    let params: PutItemInput = {
      TableName: 'test',
      Item: context
    };
    try {
      const response = await new DynamoDB.DocumentClient().put(params).promise();
      console.log('DbDynamoImpl ::: insert ::: response :::', response);
      return true;
    } catch (e) {
      console.log("DynamoDb insert error", e);
      return false;
    }
  }

};
EN

回答 3

Stack Overflow用户

发布于 2020-04-09 23:24:56

您正在解析Promise,然后再执行return语句。你能尝试用你需要返回的值来resolve Promise吗?然后,它将使用这些值转到onDone块。此外,这里有trycatch块是多余的,因为xstate中的service会自动为您处理这些问题。

只需返回服务调用语句中的promise,因为它需要是一个返回Promise的函数

代码语言:javascript
复制
function initiate(context: any) {
  console.log('DbDynamoImpl ::: insert ::: start :::');
  let params: PutItemInput = {
    TableName: 'test',
    Item: context,
  };
  return new DynamoDB.DocumentClient().put(params).promise();
}

然后在您的onDone块中,您可以console.log('DbDynamoImpl ::: insert ::: response :::', response);

代码语言:javascript
复制
onDone: {
  target: 'success',
  actions: (ctx, e) => console.log('DbDynamoImpl ::: insert ::: response :::', e),
}

票数 0
EN

Stack Overflow用户

发布于 2021-03-04 06:38:08

通过将机器解释和交互封装到promise中,您可以等待状态机进入最终状态。

大致类似于以下内容

代码语言:javascript
复制
export const recordProcessor: Handler = async (event) => {
  console.log('records size----->', event.Records.length);
  for (const record of event.Records) {
      const body = JSON.parse(record.body);
      console.log('body ----->', body);
      await setupMachine(...);
...
}

function setupMachine(...){
  return new Promise((resolve, reject) => {
    interpret(Machine({id:'test',
      context:body,
      initial: 'start',
      states:{
        start: {
          invoke: {
            src: context => initiate(context),
            onDone: {
              target: 'success'
            }
          }
        },
        success: {
          type: 'final'
        }
      }
    })).onTransition(state => {
      if (state.changed) {
        console.log('state ----> ', state.value);
      }
    })
     .onDone(() => { console.log('done--->'); return resolve()})
     .onStop(() => reject());
     .start();
   }
  });
}
票数 0
EN

Stack Overflow用户

发布于 2020-03-07 22:42:58

async添加到函数中,然后再次测试它。

代码语言:javascript
复制
exports.handler = async (event, context) => {
    return ...
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60578490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档