我正在使用AWS step函数调用这样的lambda函数。
return stepfunctions.startExecution(params).promise().then((result) => {
console.log(result);
console.log(result.output);
return result;
})
结果是
{ executionArn: 'arn:aws:states:eu-west-2:695510026694:...........:7c197be6-9dca-4bef-966a-ae9ad327bf23',
startDate: 2018-07-09T07:35:14.930Z }
但是我想要将结果作为最终lambda函数的输出
我正在经历https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/StepFunctions.html#sendTaskSuccess-property
我对那里有多重函数感到困惑,哪个函数可以用来获取最终lambda函数的结果。
stackoverflow Api gateway get output results from step function?上存在相同的问题,我不想定期调用任何函数并保持检查状态。即使我定期使用DescribeExecution函数,我也只会得到执行状态,而不会得到想要的结果。是否有任何方法或任何函数返回promise并且在所有lambda执行完毕并返回结果后得到解决
答案 0 :(得分:2)
您无法以同步方式从步进函数执行中获取结果。
不是在完成时轮询step函数的结果,而是将结果发送到SNS主题或SQS队列,以在最终的lambda函数中进行进一步处理,或者在step函数状态机中对整个过程进行建模。
答案 1 :(得分:2)
经过研究并查看了各种教程之后,我意识到此stackoverflow答案Api gateway get output results from step function?提供了一种更简单的方法来解决问题并从逐步函数中获得最终结果,是的,我不确定另一种方法以及如何实施任何新答案总是值得赞赏
这是我的代码,用于实现可能对某人有用的相同方法。
// in function first start step function execution using startExecution()
var params = {
stateMachineArn: 'some correct ARN',
input: JSON.stringify(body)
};
return stepfunctions.startExecution(params).promise().then((result) => {
var paramsStatus = {
executionArn: result.executionArn
};
var finalResponse = new Promise(function(resolve,reject){
var checkStatusOfStepFunction = setInterval(function(){
//on regular interval keep checking status of step function
stepfunctions.describeExecution(paramsStatus, function(err, data) {
console.log('called describeExecution:', data.status);
if (err){
clearInterval(checkStatusOfStepFunction);
reject(err);
}
else {
if(data.status !== 'RUNNING'){
// once we get status is not running means step function execution is now finished and we get result as data.output
clearInterval(checkStatusOfStepFunction);
resolve(data.output);
}
}
});
},200);
});
return finalResponse
})
答案 2 :(得分:0)
能够获得步进功能的结果(例如:网关和步进功能组合)。您需要:
1。 startExecution ,
2。等待状态机完成(确保等待等同于状态机的超时=> wait =状态机的秒数)
3。调用describeExecution ,并接收来自startExecution的executionArn。
请注意,startExecution是一个异步函数,它不等待结果。
就我而言,我使用名为init的Lambda执行3个讨论的步骤:
代码lambda初始化:
export const searchApcaLocation = async (dataArr,setDeals) => {
const promises = await dataArr.map(async item => {
apca.request(item.destination);
apca.onSuccess = (data) => {
return fetch('http://localhost:3050/googlePlaceSearch',{
method:"post",
headers:{'Content-Type':'application/json'},
body:JSON.stringify({
cityName:data.airports[0].city
})
})
.then(res => res.json())
.then(imagelinkData => {
const locationObject = {
data: item,
imagelink: imagelinkData.link
}
return locationObject
})
.catch(err => console.log('error on image search',err))
};
apca.onError = (data) => {
console.log('error',data)
};
})
const results = await Promise.all(promises)
return results
}
代码状态机 确保在状态机中返回“ ResultPath”。
const AWS = require('aws-sdk')
exports.handler = async (event) => {
const stepFunctions = new AWS.StepFunctions();
const reqBody = event.body || {};
const params = {
stateMachineArn: process.en.stateMachineArn,
input: JSON.stringify(reqBody)
}
return stepFunctions.startExecution(params).promise()
.then(async data => {
console.log('==> data: ', data)
await new Promise(r => setTimeout(r, 6000));
return stepFunctions.describeExecution({ executionArn: data.executionArn }).promise();
})
.then(result => {
return {
statusCode: 200,
message: JSON.stringify(result)
}
})
.catch(err => {
console.error('err: ', err)
return {
statusCode: 500,
message: JSON.stringify({ message: 'facing error' })
}
})
}