【问题标题】:Promisify a node function that loops AWS lamda functionPromisify 一个循环 AWS lambda 函数的节点函数
【发布时间】:2018-09-19 13:22:01
【问题描述】:

我想创建一个循环 AWS lambda 函数的 Promise 节点函数,但我看不到 bluebird Promise 怎么可能。 你有这个实现的例子吗?

var lambda = new AWS.Lambda();
 const lambdaInvokeAsync = Promise.promisify(lambda.invoke, {context: 
 lambda});
 for(var page = 1; page <= totalPages; page++){

  var params = {
    FunctionName: MOCK_API_FUNCTION /* required */,
    Payload: '{"page":'+page+', "limit": '+limit+', "retrievalDate":'
              +retrievalDate+ '}';
  };

   return lambdaInvokeAsync(params)
    .then((result) => {
      console.log('Successfully retrieve data');
      var dataPerPage = JSON.parse(result.Payload).data;
      dataArr.push(dataPerPage); 

      return dataArr;
    });

}

【问题讨论】:

  • 为什么把return 放在lambdaInvokeAsync(params)... 前面?它存在for循环
  • 您的问题不是承诺,而是您在循环内部return。即使没有任何承诺,那也行不通。

标签: node.js amazon-web-services promise aws-lambda bluebird


【解决方案1】:

aws-sdk 从 v2.3.0 开始支持 Promise。

您可以使用lambda.invoke(params).promise() 来返回一个承诺。

这样,你的代码就变成了……

const lambda = new AWS.Lambda();

const invokes = [];

for (let page = 1; page <= totalPages; page++) {
  const request = lambda.invoke({
    FunctionName: MOCK_API_FUNCTION /* required */ ,
    Payload: '{"page":' + page + ', "limit": ' + limit + ', "retrievalDate":' +
      retrievalDate + '}';
    }).promise();

  invokes.push(request);
}

const dataArr = Promise.all(invokes)
  .map(result => JSON.parse(result.Payload).data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2022-12-29
    • 2019-06-28
    相关资源
    最近更新 更多