如何解决如何创建文件流并异步写入流?
我是TypeScript / JavaScript和Node的新手。
现在,我正在尝试创建文件流并编写“ Hello!”。异步传输到流中。
./keycloak/bin/jboss-cli.sh --connect --command='/subsystem=logging/console-handler=CONSOLE:change-log-level(level=DEBUG)'
./keycloak/bin/jboss-cli.sh --connect --command='/subsystem=logging/root-logger=ROOT:change-root-log-level(level=DEBUG)'
./keycloak/bin/jboss-cli.sh --connect --command='/subsystem=logging/logger=org.keycloak:write-attribute(name=level,value=DEBUG)'
此代码确实创建了#!/usr/bin/env node
import fs from 'fs';
function createStream(filePath: string): Promise<fs.WriteStream> {
return new Promise<fs.WriteStream>((resolve,reject) => {
const out = fs.createWriteStream(filePath);
out.on('close',() => {
console.log(filePath + ' closed');
resolve(out);
});
out.on('error',(err: any) => {
console.log(filePath + ' ' + err);
reject(err);
});
});
}
createStream('/tmp/test.txt').then((out:fs.WriteStream) => {
console.log(out);
out.write('Hello!');
out.end();
})
,但是什么也没打印出来,并且文件为空。
此代码有什么问题?
解决方法
由于const gulp = require('gulp'),sass = require('gulp-sass'),autoprefixer = require('gulp-autoprefixer'),cleanCSS = require('gulp-clean-css'),concatCss = require('gulp-concat-css'),uglify = require('gulp-uglify'),pipeline = require('readable-stream').pipeline,concat = require('gulp-concat'),terser = require('gulp-terser'),newer = require('gulp-newer');
gulp.task('sass',() =>
gulp.src('./src/scss/*.scss')
.pipe(newer('./src/scss/*.scss'))
.pipe(sass())
.pipe(concatCss("style.css"))
.pipe(cleanCSS())
.pipe(gulp.dest('./dist/css'))
);
gulp.task('jsfiles',function () {
return pipeline(
gulp.src('./src/js/*.js'),newer('./src/js/*.js'),concat('vendor.js'),uglify({
compress:true
}),gulp.dest('./dist/js')
);
});
gulp.task('default',() => {
gulp.watch(['./src/scss/*.scss','./src/js/*.js'],gulp.series('sass','jsfiles'));
})
的创建是同步的,因此您无需使用fs.WriteStream
来解决承诺。只需直接调用fs.createWriteStream()
并将实例传递给您的函数即可创建一个承诺,该承诺将在流关闭或错误时解决:
#!/usr/bin/env node
import fs from 'fs';
import stream from 'stream';
function promisify(s: stream.Stream): Promise<void> {
return new Promise<void>((resolve,reject) => {
const onClose = () => {
s.off('error',onError);
resolve();
};
const onError = (error: Error) => {
s.off('close',onClose);
reject(error);
};
s.once('close',onClose);
s.once('error',onError);
});
}
const out = fs.createWriteStream('/tmp/test.txt');
promisify(out).then(() => {
console.log('Done');
});
out.write('Hello!');
out.end();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。