我在Node JS中创建了以下三种方法
function UpdateJson(reqData){
let rawdata = fs.readFileSync('someData.json');
let data = JSON.parse(rawdata);
Object.keys(data).forEach(function(key) {
data[key] = reqData[key];
});
fs.truncateSync('someData.json', 0, function(){});
let jstrData = JSON.stringify(data);
fs.writeFileSync('someData.json', jstrData, function(){});
}
function CreateThemeScss(jFile){
fs.createReadStream(jFile)
.pipe(jsonSass({
prefix: '$theme: ',
}))
.pipe(fs.createWriteStream('sData.scss'));
}
function ExecuteCmd(){
exec('node-sass sData.scss styles.css');
var rdata = fs.readFileSync('styles.css').toString();
return rdata;
}
我正在按相同的顺序在app.post方法中调用这些方法。
我正在从响应中的rdata
方法返回的ExecuteCmd
中发回邮件。
我看到每次从rdata
方法调用API ExecuteCmd
时都是相同的。我希望上述方法同步执行,以便CreateThemeScss
仅在UpdateJson
完成后执行,ExecuteCmd
必须仅在CreateThemeScss
完成后执行,这样我才能获得更新的{ {1}}。
欢迎任何帮助
答案 0 :(得分:0)
首先,您需要Stream NodeJS documentation。
我从您的问题中了解到,CreateThemeScss
函数调用保持异步,因为jsonSass
给您一个stream
对象。
但是您似乎想在执行CreateThemeScss
之前等待ExecuteCmd
流的结束。
如果出现问题,这就是我们可以采取的方法:
function UpdateJson(reqData) {
const rawdata = fs.readFileSync('someData.json');
let data = JSON.parse(rawdata);
Object.keys(data).forEach(function(key) {
data[key] = reqData[key];
});
// fs.truncateSync('someData.json', 0, function(){});
// is wrong called, see https://nodejs.org/dist/latest-v8.x/docs/api/fs.html#fs_fs_ftruncatesync_fd_len
fs.truncateSync('someData.json', 0);
const jstrData = JSON.stringify(data);
// fs.writeFileSync('someData.json', jstrData, function(){});
// is wrong called, see https://nodejs.org/api/fs.html#fs_fs_writefilesync_file_data_options
fs.writeFileSync('someData.json', jstrData);
}
function CreateThemeScss(jFile) {
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(jFile);
readStream.on('error', reject);
readStream.on('end', resolve);
readStream
.pipe(jsonSass({
prefix: '$theme: ',
}))
.pipe(fs.createWriteStream('sData.scss'));
}
}
function ExecuteCmd() {
exec('node-sass sData.scss styles.css');
// return rdata
return fs.readFileSync('styles.css').toString();
}
并这样称呼:
...
UpdateJson("{'test':'test'}");
await CreateTheme(dJson.json);
var a = ExecuteCmd();
...