我有一个如下所示的节点脚本:
// Preset Modules...
const fs = require("fs-extra");
const path = require("path");
const { join } = path;
const axios = require("axios");
// Global/Multi modules...
const { today } = require("./keys/globals");
const { logger } = require("./logger");
// Sequence modules...
const downloader = require("./downloader");
const settingScraper = require("./settings");
const treeMaker = require("./treeMaker");
/****/ const pythonWriter = require("./pythonWriter"); /****/
const fbDaemon = require("./firebase");
const zipper = require("./zipper");
const mailer = require("./mailer");
const { success, failure } = require("./results");
logger.write(`\nStarting download for: ${today}, at ${Date.now()}`);
axios.get(`http://federalregister.gov/api/v1/public-inspection-documents.json?conditions%5Bavailable_on%5D=${today}`)
.then(downloader)
.then(settingScraper)
.then(treeMaker)
/****/ .then(pythonWriter) /****/
.then(fbDaemon) // Should pass down array structure, like in config file.
.then(zipper)
.then(mailer)
.then(success)
.catch(failure);
该函数在线从API下载大量文件,而pythonWriter是一个单独的模块。在该模块中,我想触发一个python脚本,该脚本将在pythonWriter返回Promise之前“暂停”或同步执行。许诺将不必包含任何数据。
看起来像这样:
const util = require("util");
const spawn = require("child_process").spawn;
const pythonWriter = () => {
const process = spawn("python", ["./script.py"]);
}
module.exports = pythonWriter;
如何在我的其余Javascript代码之前生成或创建一个同步执行的子流程?或者,如果不可能的话,返回类似promise的对象,然后将触发一个单独的then-block?
感谢您的帮助。
答案 0 :(得分:1)
您看过child_process documentation吗?
您可以使用spawnSync()
,也可以监视spawn返回的childProcess对象上的事件以了解其完成时间,或者可以将回调函数与.exec()
或.execFile()
一起使用,或者.spawn()
查看完成的时间。
child_process文档似乎已经涵盖了您的要求。
以下是使用.spawn()
的示例,摘自文档:
const { spawn } = require('child_process');
const ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
您可以收听close
事件以了解其完成时间。