Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于按顺序执行承诺函数的长度未知的数组_Javascript_Arrays_Node.js_Es6 Promise - Fatal编程技术网

Javascript 用于按顺序执行承诺函数的长度未知的数组

Javascript 用于按顺序执行承诺函数的长度未知的数组,javascript,arrays,node.js,es6-promise,Javascript,Arrays,Node.js,Es6 Promise,我正在node.js服务器上创建一个函数,它读取一个CSV文件,我需要读取所有行并为每个行执行几个承诺的操作(Mysql查询)(更新或插入,然后设置一个指定列,该列将该项标识为“在执行中修改”)完成后,在未更新或插入的项目上更改另一列,以将这些项目标识为“已删除” 起初,我遇到的问题是,这个CSV有数百万行(字面上)和100列,因此我很容易耗尽内存,而且行数可能会增加或减少,因此我无法知道每次收到它时必须处理的行数 我制作了一个简单的程序,允许我用可读的行数将这个CSV与其他CSV分开,这样我的

我正在node.js服务器上创建一个函数,它读取一个CSV文件,我需要读取所有行并为每个行执行几个承诺的操作(Mysql查询)(更新或插入,然后设置一个指定列,该列将该项标识为“在执行中修改”)完成后,在未更新或插入的项目上更改另一列,以将这些项目标识为“已删除”

起初,我遇到的问题是,这个CSV有数百万行(字面上)和100列,因此我很容易耗尽内存,而且行数可能会增加或减少,因此我无法知道每次收到它时必须处理的行数

我制作了一个简单的程序,允许我用可读的行数将这个CSV与其他CSV分开,这样我的服务器就可以在不死掉的情况下处理每个CSV,从而使每个新文件处理的文件数量未知,所以现在我有了一个不同的问题

我想读取所有这些CSV,进行这些操作,一旦这些操作完成,执行最后一个,它将更改那些未更新/插入的CSV。唯一的问题是,我需要阅读所有这些内容,而我不能同时阅读,我必须按顺序阅读,无论它们有多少(如前所述,分离主CSV后,我可能会将100万行分为3个文件,或将200万行分为6个文件)

起初我想使用forEach循环,但问题是,forEach不尊重承诺,所以它会启动所有这些循环,服务器在加载所有CSV时会耗尽内存,然后死机。老实说,在foreach的每次迭代中使用while(boolean)来等待每个promisified函数的解析似乎很不错。。。。对我来说很难闻,而且我觉得这个解决方案会阻止服务器正常工作,所以我正在寻找一个不同的解决方案

让我快速解释一下我想要什么:

const arrayReader=(([arrayOfCSVs])=>{
initialFunction();
functions(arrayOfCSVs[0])
  .then((result)=>{
    functions(arrayOfCSVs[1])
      .then((result2)=>{
        functions(arrayOfCSVs[2])
        (OnAndOnAndOnAndOn...)
        .then((resultX)=>{
          executeFinalFunction();
        });
    });
});

您可以使用
Array.reduce
获取以前的承诺并将新承诺排队,而无需等待

const arrayReader = ([arrayOfCSVs]) => {
  initialFunction();
  return arrayOfCSVs.reduce((prom, csv) => {
    return prom.then(() => functions(csv));
  }, Promise.resolve()).then(resultX => executeFinalFunction());
}

不幸的是,这似乎与使用foreach创建承诺函数数组的方式相同,然后使用promise.all,它几乎同时启动所有承诺,因此,我无法将它们排队。使用该算法,我一开始就有以下控制台日志:开始处理csv文件从csv文件开始查询Csv1.csv从csv文件开始查询Csv2.csv从csv文件开始查询Csv3.csv从csv文件完成处理所有csv文件完成更新后/更新200 445.656 ms-40插入完成插入可能是您的函数
functions
未返回承诺。我给出的代码将数组转换为这种格式
functions(arr[0])。然后(()=>functions(arr[1])。然后(…)
函数
functions
正确地返回了一个承诺,这是我的错,因为我过多地编辑了你给我的代码。非常感谢,因为它工作完美,而且TBH从未以这种方式使用过reduce函数。向上投票!