Как можно запустить сценарий только после завершения другого сценария? - PullRequest
1 голос
/ 02 мая 2020

Допустим, это мой код (просто пример, который я написал, чтобы показать идею)

var extract = require("./postextract.js");
var rescore = require("./standardaddress.js");

RunFunc();

function RunFunc() {
    extract.Start();
    console.log("Extraction complete");
    rescore.Start();
    console.log("Scoring complete");
}

И я не хочу, чтобы rescore.Start () работал до полного extract.Start ( ) закончил. Оба сценария содержат паутину функций внутри них, поэтому обратный вызов, помещенный непосредственно в функцию Start (), не выглядит жизнеспособным, так как конечная функция не возвращает его, и у меня много проблем с пониманием того, как использовать Promises , Как я могу заставить эту работу работать?

Это сценарии, которые extract.Start () начинается и заканчивается. OpenWriter () доступен через множество других функций и потоков, при этом фактический fileWrite.write () находится в другом скрипте, который присоединен к этому (хотя и не нужен для определения конца выполнения. В настоящее время fileWrite.on ('fini * 1012) * ') я хочу, чтобы скрипт был определен как выполненный

module.exports = {
  Start: function CodeFileRead() {
    //this.country = countryIn;
    //Read stream of thate address components
    fs.createReadStream("Reference\\" + postValid.country + " ADDRESS REF DATA.csv")
      //Change separator based on file
      .pipe(csv({escape: null, headers: false, separator: delim}))
      //Indicate start of reading
      .on('resume', (data) => console.log("Reading complete postal code file..."))
      //Processes lines of data into storage array for comparison
      .on('data', (data) => {
        postValid.addProper[data[1]] = JSON.stringify(Object.values(data)).replace(/"/g, '').split(',').join('*');
        })
      //End of reading file
      .on('end', () => {
        postValid.complete = true;
        console.log("Done reading");
        //Launch main script, delayed to here in order to not read ahead of this stream
        ThisFunc();
      });
  },

  extractDone
}

function OpenWriter() {
    //File stream for writing the processed chunks into a new file
    fileWrite = fs.createWriteStream("Processed\\" + fileName.split('.')[0] + "_processed." + fileName.split('.')[1]);
    fileWrite.on('open', () => console.log("File write is open"));
    fileWrite.on('finish', () => {
      console.log("File write is closed");
    });
}

РЕДАКТИРОВАТЬ: я не хочу просто добавлять следующий скрипт в конец предыдущего и впереди go мастер-файл Поскольку я не знаю, как долго это будет и должно быть разработано так, чтобы оно могло принимать дополнительные сценарии после нашего периода разработки.Я не могу просто использовать пакет в его нынешнем виде, потому что время утверждения в компании занимает до двух недель. и мне нужно это немедленно немедленно

ДВОЙНОЕ РЕДАКТИРОВАНИЕ: Это весь мой код, все скрипты и функции написаны мной, поэтому я могу заставить вызываемые скрипты делать то, что нужно

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Используйте async / await (обещания), пример:

var extract = require("./postextract.js");
var rescore = require("./standardaddress.js");
RunFunc();

async function extract_start() {
   try {
       extract.Start()
   }
   catch(e){
      console.log(e)
   }
}

async function rescore_start() {
   try {
       rescore.Start()
   }
   catch(e){
      console.log(e)
   }
}

async function RunFunc() {
    await extract_start();
    console.log("Extraction complete");
    await rescore_start();
    console.log("Scoring complete");
}
1 голос
/ 02 мая 2020

Нет универсального c способа определить, когда все, что делает вызов функции, завершилось.

Может принять обратный вызов. Это может вернуть обещание. Он не может предоставить какой-либо метод определения того, когда это будет сделано. У него могут быть побочные эффекты, которые вы можете отслеживать, опрашивая.

Вам необходимо прочитать документацию и / или исходный код для этой конкретной функции.

0 голосов
/ 02 мая 2020

Вы можете просто обернуть свою функцию в Promise и вернуть ее.

module.exports = {
  Start: function CodeFileRead() {
    return new Promise((resolve, reject) => {
      fs.createReadStream(
        'Reference\\' + postValid.country + ' ADDRESS REF DATA.csv'
      )
      // .......some code...
      .on('end', () => {
        postValid.complete = true;
        console.log('Done reading');
        resolve('success');
      });
    });
  }
};

И запустить RunFun c следующим образом:

async function RunFunc() {
  await extract.Start();
  console.log("Extraction complete");
  await rescore.Start();
  console.log("Scoring complete");
}

//or IIFE
RunFunc().then(()=>{
  console.log("All Complete");
})

Примечание: Также вы можете / должны обрабатывать ошибку reject("some error") при возникновении ошибки :
eventEmitter. js

const EventEmitter = require('events').EventEmitter
module.exports = new EventEmitter()
const eventEmitter = require('./eventEmitter');
module.exports = {
  Start: function CodeFileRead() {
    return new Promise((resolve, reject) => {
      //after all of your code
      eventEmitter.once('WORK_DONE', ()=>{
        resolve("Done");
      })
    });
  }
};
function OpenWriter() {
  ...
  fileWrite.on('finish', () => {
    console.log("File write is closed");
    eventEmitter.emit("WORK_DONE");
  });
}

И запустите RunFun c, как и раньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...