我有一些看起来像这样的代码:
async function promptHandler(source) {
source.subscribe(function(line) {
console.log(`line == ${line}`);
});
let matchingTests = await getMatchingTests('ROGL');
}
这将打印出source
Observable的内容,该内容正在监听ReadStream
txt
个文件的subscribe()
。当调用上面的函数时,我看到文件的输出。但是,如果我在调用 getMatchingTests()
之后致电async function promptHandler(source) {
let matchingTests = await getMatchingTests('ROGL');
source.subscribe(function(line) {
console.log(`line == ${line}`);
});
}
,请执行以下操作:
getMatchingTests
我没有看到txt文件的内容。我知道matchingTests变量包含getMatchingTests
的成功结果,所以我认为它不会阻止Node执行该行。
我猜测source
异步函数调用的某些内容正在弄乱source
Observable,但我没看到。
这是我的let fileStream = createReadStream(file)
.pipe(split());
let source = new Observable(o => {
fileStream.on('data', line => {console.log('data'); o.next(line);});
fileStream.on('error', err => o.error(err));
fileStream.on('end', () => {console.log('end'); o.complete();});
});
代码:
{{1}}
答案 0 :(得分:1)
我的直觉是源可观察源是一个热源,并且在await
返回匹配测试时,您的文本文件已经被读取。因此,当您在该点订阅时,没有要阅读的行,在您订阅源之前已阅读它们。
更新: 鉴于您的代码,如果排序是您的用例的问题,您可以考虑将文件流创建移动到可观察的工厂,即。
let source = new Observable(o => {
let fileStream = createReadStream(file)
.pipe(split());
fileStream.on('data', line => {console.log('data'); o.next(line);});
fileStream.on('error', err => o.error(err));
fileStream.on('end', () => {console.log('end'); o.complete();});
});
这样,只有在订阅时才会创建并启动流。