如何发现ID,并等待现有的Promise?

时间:2019-01-13 15:17:31

标签: javascript synchronization

最简单的解决方案可能是在添加一些await之后再使用一些promise pattern,或者重新使用...
我不知道如何重新使用 Promise,我假设它已经存在于方法csv-parse.readFileSync()或方法parse()中,如下所示。

另一种解决方案是添加更多的Promise和一些 async / await :整个LOAD块可以是一个函数...但是我也看不到将awaits放在哪里

'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?

3 个答案:

答案 0 :(得分:0)

csv-parse根据https://csv.js.org/parse/api/#sync-api

提供了一个同步API

我猜想使用此方法可以解决您要避免的整个promise / callback麻烦

答案 1 :(得分:0)

这是一个解决方法,不是使用例如await
(请编辑此答案,它是一个Wiki,您可以更正我的假设,英语或添加线索和链接)


似乎唯一的解决方案是丑陋的幼稚解决方案,将所有软件封装在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!!");
}

我真正需要的是承诺的未记录名称,以便于所有人等待。参见the problem

答案 2 :(得分:0)

您正在以同步模式读取文件,但是正在以异步模式进行解析。如前所述,要在同步模式下使用解析器,必须要求initialX使用CSV parse sync API

GitHub上查看我的答案,其中包括一个示例。