[英]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.