簡體   English   中英

只有在另一個腳本完成后才運行腳本的方法是什么?

[英]What are ways to run a script only after another script has finished?

可以說這是我的代碼(只是我寫的一個示例來展示這個想法)

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() function 似乎不可行,因為最終的 function 不會返回它,而且我在理解如何使用 Promises 時遇到了很多麻煩. 我有什么方法可以完成這項工作?

這些是 extract.Start() 開始和結束的腳本。 OpenWriter() 是通過多個其他函數和流獲得的,實際的 fileWrite.write() 位於附加到此的另一個腳本中(盡管不需要檢測運行結束。目前,fileWrite.on('finish')是我希望將腳本確定為已完成的位置

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");
    });
}

編輯:我不想簡單地將下一個腳本添加到前一個腳本的末尾並放棄主文件,因為我不知道它將持續多長時間,並且它應該被設計為能夠接受其他腳本過去我們的發展時期。 我不能只使用 package,因為公司的審批時間最多需要兩周,我更需要這個

雙重編輯:這是我所有的代碼,每個腳本和 function 都是我寫的,所以我可以讓被調用的腳本做需要的事情

沒有通用的方法來確定 function 調用所做的一切何時完成。

它可能會接受回調。 它可能會返回 promise。 它可能不提供任何類型的方法來確定何時完成。 它可能有副作用,您可以通過輪詢來監控。

您需要閱讀特定 function 的文檔和/或源代碼。

使用 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"); }

您可以將 function 包裝在 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');
      });
    });
  }
};

並像這樣運行 RunFunc:

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")來處理錯誤。

編輯了解 TheFunc() 后:

制作一個新的事件發射器可能是最簡單的解決方案:
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");
  });
}

並像以前一樣運行 RunFunc。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM