【问题标题】:Waiting for forEach loop in aws lambda function等待 aws lambda 函数中的 forEach 循环
【发布时间】:2019-05-19 11:51:24
【问题描述】:

如何在 aws lambda 中执行 return 语句之前等待 forEach 循环完成?

module.exports.shipments = async (event) => {
    const axios = require("axios");
    let data = JSON.parse(event.body);
    let url = data.apiURL + "/api/1.1/wf/bulkshipments/initialize";
    let patchURL = data.apiURL + "/api/1.1/obj/company/" + data.companyID;

    data.shipments.forEach((item, index, array) => {
        axios.post(url,{
        batchID: data.batchID,
        companyID: data.companyID,
        shipment: item})
    });

    return {
      statusCode: 200,
      body: JSON.stringify({
        message: 'Created successfully!',
        totalShipments: data.shipments.length,
      }, null, 2),
    };
};

【问题讨论】:

    标签: javascript node.js lambda async-await


    【解决方案1】:

    你已经在使用异步了,所以使用 map 返回一个 Promise 列表,并使用 Promise.all() 等待它们:

    module.exports.shipments = async (event) => {
        const axios = require("axios");
        let data = JSON.parse(event.body);
        let url = data.apiURL + "/api/1.1/wf/bulkshipments/initialize";
        let patchURL = data.apiURL + "/api/1.1/obj/company/" + data.companyID;
    
        let promises = data.shipments.map(item =>
            axios.post(url, {
                batchID: data.batchID,
                companyID: data.companyID,
                shipment: item})
            })
        );
    
        await Promise.all(promises);
    
        return {
          statusCode: 200,
          body: JSON.stringify({
            message: 'Created successfully!',
            totalShipments: data.shipments.length,
          }, null, 2),
        };
    };
    

    要让每个呼叫等待,而不是同时触发所有发布请求,请使用for...of loop

    module.exports.shipments = async (event) => {
        const axios = require("axios");
        let data = JSON.parse(event.body);
        let url = data.apiURL + "/api/1.1/wf/bulkshipments/initialize";
        let patchURL = data.apiURL + "/api/1.1/obj/company/" + data.companyID;
    
        for (let item of data.shipments) {
            await axios.post(url, {
                batchID: data.batchID,
                companyID: data.companyID,
                shipment: item})
            });
        }
    
        await Promise.all(promises);
    
        return {
          statusCode: 200,
          body: JSON.stringify({
            message: 'Created successfully!',
            totalShipments: data.shipments.length,
          }, null, 2),
        };
    };
    

    【讨论】:

    • 如何在每次通话之间添加延迟?
    猜你喜欢
    • 2019-12-12
    • 2020-05-09
    • 1970-01-01
    • 2015-04-19
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多