1
votes

Comment découvrir l'identifiant et attendre une promesse existante?

La solution la plus simple est peut-être un attendez après avoir ajouté des modèle de promesse , ou réutilisation ...
Je ne vois pas comment réutiliser la promesse, que je suppose qu'elle existe déjà, dans la méthode csv-parse.readFileSync ( ) , ou la méthode parse () , illustrée ci-dessous.

Une autre solution est d'ajouter plus de promesses et quelques async/await : tout le bloc LOAD peut être une fonction ... Mais je ne vois pas non plus où mettre l'attente .

   2. END!!
   1. cover from JSON

Le résultat est

'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!!");

Comment obtenir l'étape2 après l'étape1?


0 commentaires

3 Réponses :


0
votes

csv-parse propose une API de synchronisation selon https: //csv.js .org / parse / api / # sync-api

Je suppose que l'utilisation de cela fonctionne autour de tous les tracas de promesse / rappel que vous voulez éviter


2 commentaires

Hum ... C'est une solution de contournement ... Ok, j'essaye. Problème lors du remplacement de require ('csv-parse') par require ('csv-parse / lib / sync') : (node: 11788) UnhandledPromiseRejectionWarning: Rejet de promesse non gérée ( identifiant de rejet: 1): TypeError: parse (...). on n'est pas une fonction (nœud: 11788) [DEP0018] DeprecationWarning: les rejets de promesse non gérés sont obsolètes. À l'avenir, les refus de promesse qui ne sont pas traités mettront fin au processus Node.js avec un code de sortie différent de zéro.


C'est peut-être un malentendu. Je pensais que vous vouliez que le code soit synchrone, alors je suis venu avec ceci. Si vous souhaitez le conserver de manière asynchrone, vous devez vous assurer que le "2. END !!" les instructions ne sont appelées que si les blocs if / else sont terminés. Je recommande donc de tout emballer dans une fonction, qui renvoie une promesse, que vous pouvez gérer. Si vous vous retrouvez dans la clause else, faites simplement Promise.resolve (), donc la méthode retourne, comme ceci return Promise.resolve (COVER);



1
votes

C'est plus une solution de contournement, pas une vraie solution utilisant par exemple attendez .
(veuillez modifier cette réponse, c'est un Wiki, vous pouvez corriger mes hypothèses, mon anglais, ou ajouter des indices et des liens)


Il semble que la seule solution est la solution laide et naïve, encapsulant tous les logiciels dans une fonction 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!!");
}

Ce dont j'ai vraiment besoin, c'est le nom non documenté des promesses em > être facile d'attendre tous. Voir le problème


0 commentaires

0
votes

vous lisez le fichier en mode synchro mais vous analysez en mode asynchrone. Pour utiliser l'analyseur en mode synchro, comme expliqué précédemment, vous devez avoir besoin de csv-parse / lib / sync pour utiliser le API de synchronisation d'analyse CSV .

Voir ma réponse sur GitHub qui inclut un exemple.


0 commentaires