如何发现 id,并等待现有承诺



最简单的解决方案await可能是在添加一些承诺模式或重用
...我不明白如何将 Promise(我认为它已经存在)重到方法 csv-parse.readFileSync() 或方法parse()中,如下所示。

另一种解决方案是添加更多的承诺和一些异步/等待:整个 LOAD 块可以是一个函数......但我也不明白等待的地方。

'use strict';
const fs     = require('fs')
const path   = require('path')
// CONFIGS:
const cf_cover_dataset = '../data/cover.csv'
var COVER = null;
// LOAD external configs:
var COVER_file = path.resolve(__dirname, cf_cover_dataset);
if (path.extname(cf_cover_dataset)=='.csv') {
  const parse  = require('csv-parse') // npm i csv-parse  (not parse"r")
  let raw = []
  parse(fs.readFileSync( COVER_file ), {
    trim: true,
    skip_empty_lines: true
  })
  .on('readable', function(){
    let record
    while (record = this.read()){
      raw.push(record)  ; console.log('.')}
  })
  .on('error', function(err){ console.error(err.message) })
  .on('end', function(){
     // I NEED TO WAY THE END HERE, HOW TO?
    COVER = f(raw);
    console.log("1. cover from CSV");
  });
} else {
  COVER = JSON.parse(COVER_file)  // ... and WAY here
  console.log("1. cover from JSON");
}
console.log("2. END!!");

结果是

   2. END!!
   1. cover from JSON

如何在步骤1之后获得步骤2?

这更是一种解决方法,而不是使用例如 await .
(请编辑这个答案,这是一个维基,你可以纠正我的假设,我的英语,或者添加线索和链接)


似乎唯一的解决方案是丑陋的幼稚解决方案,将所有软件封装在一个main()函数中:

if (path.extname(cf_cover_dataset)=='.csv') {
  ...
  parse(fs.readFileSync( COVER_file ), {
    ...
  })
  .on('readable', function(){
    ...
  })
  .on('error', function(err){ ... })
  .on('end', function(){
    COVER = f(raw);
    console.log("1. cover from CSV");
    main();
  });
} else {
  COVER = JSON.parse(COVER_file)  // ... and WAY here
  console.log("1. cover from JSON");
  main();
}
function main() {  // step2, ugly but run in sequence 
   console.log("2. END!!");
}

我真正需要的是承诺的无记录名称,以便于等待所有人。请参阅问题<</p>

div class="one_answers">

csv-parse 根据 https://csv.js.org/parse/api/#sync-api 提供同步 API

我想使用它可以解决您想要避免的整个承诺/回调麻烦

您正在同步模式下读取文件,但在异步模式下解析。若要在同步模式下使用分析器(如前所述),必须要求csv-parse/lib/sync使用 CSV 分析同步 API。

请参阅我在GitHub上的答案,其中包括一个示例。

最新更新