只有在另一个脚本完成后才 运行 一个脚本的方法是什么?
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() 函数似乎不可行,因为最终函数不会 return 它,而且我很难理解如何使用承诺。我可以通过哪些方式完成这项工作?
这些是 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");
});
}
编辑:我不想简单地将下一个脚本添加到前一个脚本的末尾并放弃主文件,因为我不知道它会持续多长时间,也不知道它应该被设计成能够在我们的开发期之后使用其他脚本。我不能直接使用现有的包裹,因为公司的审批时间最多需要两周,我更需要这个
双重编辑:这是我的全部代码,每个脚本和函数都是我编写的,因此我可以让被调用的脚本执行所需的操作
没有通用的方法来确定函数调用所做的一切何时完成。
它可能会接受回调。它可能 return 一个承诺。它可能不提供任何类型的方法来确定何时完成。它可能有副作用,您可以通过轮询来监控。
您需要阅读该特定功能的文档 and/or 源代码。
使用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");
}
您可以将您的函数包装在 Promise 中,然后 return 那。
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');
});
});
}
};
和 运行 运行Func 是这样的:
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");
})
注意:当发生某些错误时,您 can/should 通过 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");
});
}
和 运行 运行Func 和以前一样。
可以说这是我的代码(只是我写的一个示例来展示这个想法)
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() 函数似乎不可行,因为最终函数不会 return 它,而且我很难理解如何使用承诺。我可以通过哪些方式完成这项工作?
这些是 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");
});
}
编辑:我不想简单地将下一个脚本添加到前一个脚本的末尾并放弃主文件,因为我不知道它会持续多长时间,也不知道它应该被设计成能够在我们的开发期之后使用其他脚本。我不能直接使用现有的包裹,因为公司的审批时间最多需要两周,我更需要这个
双重编辑:这是我的全部代码,每个脚本和函数都是我编写的,因此我可以让被调用的脚本执行所需的操作
没有通用的方法来确定函数调用所做的一切何时完成。
它可能会接受回调。它可能 return 一个承诺。它可能不提供任何类型的方法来确定何时完成。它可能有副作用,您可以通过轮询来监控。
您需要阅读该特定功能的文档 and/or 源代码。
使用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");
}
您可以将您的函数包装在 Promise 中,然后 return 那。
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');
});
});
}
};
和 运行 运行Func 是这样的:
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");
})
注意:当发生某些错误时,您 can/should 通过 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");
});
}
和 运行 运行Func 和以前一样。