我有一个lambda函数,它使用xstate按顺序执行某些任务,其中一个步骤是将数据保存到dynamo db。但我的lambda在执行下面这行代码后立即结束执行。
const response = await new DynamoDB.DocumentClient().put(params).promise();我的代码:
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;
}
}
};发布于 2020-04-09 23:24:56
您正在解析Promise,然后再执行return语句。你能尝试用你需要返回的值来resolve Promise吗?然后,它将使用这些值转到onDone块。此外,这里有try和catch块是多余的,因为xstate中的service会自动为您处理这些问题。
只需返回服务调用语句中的promise,因为它需要是一个返回Promise的函数
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);
onDone: {
target: 'success',
actions: (ctx, e) => console.log('DbDynamoImpl ::: insert ::: response :::', e),
}
发布于 2021-03-04 06:38:08
通过将机器解释和交互封装到promise中,您可以等待状态机进入最终状态。
大致类似于以下内容
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();
}
});
}发布于 2020-03-07 22:42:58
将async添加到函数中,然后再次测试它。
exports.handler = async (event, context) => {
return ...
}https://stackoverflow.com/questions/60578490
复制相似问题