当前位置: 首页 > 知识库问答 >
问题:

NodeJS中的异步foreach或for循环

郑茂勋
2023-03-14

我是NodeJs的初学者,请原谅。下面的lambda函数是在S3中压缩/压缩文件,并将压缩后的文件上传回S3。ListOfKeys包含要压缩的键的列表。如果您注意到(listOfKeys中的const file)的,那么如果有一个大的数据集,即listOfKeys有很长的键列表,则会同步运行得到的lambda超时。问题是,是否有一种方法可以异步或并行地运行循环,以便及时或异步地压缩文件

代码:

const AWS = require('aws-sdk');
const archiver = require('archiver');
const stream = require('stream');
const request = require('request');

const awsOptions = {
    region: 'us-east-1'
};
const s3 = new AWS.S3(awsOptions);

const streamTo = (bucket, key) =>{};

const getStream = (bucket, key) => {};

exports.handler = async (event, context, callback) => {

    const listOfKeys = [];
    // some code here..
    listOfKeys.push(...contents.map(x => x.Key));

    await new Promise(async (resolve, reject) => {
        var zipStream = streamTo(SrcBucket, destinationKey);
        zipStream.on("close", resolve);
        zipStream.on("end", resolve);
        zipStream.on("error", reject);
        var archive = archiver("zip");
        archive.on("error", err => {
            throw new Error(err);
        });
        archive.pipe(zipStream);

        for (const file in listOfKeys) {
            archive.append(getStream(SrcBucket, listOfKeys[file]), { name: listOfKeys[file].split('/')[3] });
        }

        archive.finalize();
    }).catch(err => {
        throw new Error(err);
    });

    callback(null, {
        body: { final_destination: destinationKey }
    });
};

共有2个答案

岳硕
2023-03-14

我可能会更加灵活地重写整个内容,但为了回答您的具体问题:将ListOfKeys.foreach语句替换为:

await Promise
  .all(
    listOfKeys.map(key => archive.append(getStream(SrcBucket, key), { name: key.split('/')[3] }))
  );
齐奕
2023-03-14
const array1 = ['a', 'b', 'c'];

array1.forEach(element => console.log(element));

// expected output: "a"
// expected output: "b"
// expected output: "c"

所以您的代码应该是:

listOfKeys.forEach(file => {
    archive.append(getStream(SrcBucket, listOfKeys[file]), { name: listOfKeys[file].split('/')[3] })
})

(不确定是否可行,请告诉我)

源:array.prototype.foreach()MDN

 类似资料:
  • 如果我像下面这样使用forloop- 它只对Row的最后一个值执行driver.findElement命令。如果我在这个for循环中放入第一个return语句(如上),它只对row=2执行并关闭浏览器。

  • 问题内容: 我是JavaScript和node.js的新手。我想遍历目录并将所有文件统计信息(而不是其他目录)添加到数组中。如下所示,我的代码存在问题,因为回调可能在for循环完成后被调用,因此在回调方法中使用“ i”变量将不起作用。但是代码应如何显示,以便以下代码段起作用?它与闭包有关吗? 感谢帮助! 问题答案: 您需要使用闭包是正确的。您应该将循环的内容包装在一个自调用函数中,以保留每次迭代的

  • 问题内容: 在循环中使用/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。 这段代码确实有效,但是这可能会出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用/ ,所以我只是想问一下这是否有问题。 问题答案: 确保代码确实有效,但是我很确定它不会实现您期望的功能。它只会触发多个异步调用,但此后函数会立即返回。 顺序阅读 如果要顺序读取文件, 则不能使用。只需使用现代循环即可,该循环将按预

  • 问题内容: 当我使用量角器执行以下代码时,它可以工作。我将嵌套的json传递给for循环。由于for循环的异步工作,它将打印变量i的所有值并达到最后一个值,因此它始终访问最后一对用户名和密码。我该如何解决这个问题? 问题答案: 您需要牢记,不能将-loop与promises一起使用。一切都是异步的,所以 最终它会咬到你 ,这意味着它已经准备好了,但测试还没有。 根据您的示例,建议创建一个名为例如的

  • 问题内容: 这个问题已经在这里有了答案 : 循环内的JavaScript封闭-简单的实际示例 (44个答案) 2年前关闭。 我正在运行以下形式的事件循环: 我正在尝试显示一系列警报,显示从0到10的数字。问题是,当触发回调函数时,循环已经经历了几次迭代,并且显示了更高的值。有关如何解决此问题的任何建议? 问题答案: 在启动所有异步操作时,循环将立即运行到完成。当他们将来完成某个时间并调用其回调时,

  • 问题内容: 我如何访问传递给fs.lstat函数的变量? 问题答案: 这是使用而不是for循环迭代值的完美理由。 另外,您可以使用@Aadit建议的闭包: