Javascript 如果在调用异步函数后调用Observer订阅服务器,为什么它没有运行?
我有一些代码如下所示:Javascript 如果在调用异步函数后调用Observer订阅服务器,为什么它没有运行?,javascript,asynchronous,observable,rxjs,Javascript,Asynchronous,Observable,Rxjs,我有一些代码如下所示: async function promptHandler(source) { source.subscribe(function(line) { console.log(`line == ${line}`); }); let matchingTests = await getMatchingTests('ROGL'); } async function promptHandler(source) { let matchingT
async function promptHandler(source) {
source.subscribe(function(line) {
console.log(`line == ${line}`);
});
let matchingTests = await getMatchingTests('ROGL');
}
async function promptHandler(source) {
let matchingTests = await getMatchingTests('ROGL');
source.subscribe(function(line) {
console.log(`line == ${line}`);
});
}
这将打印出可观察的源
的内容,该内容正在侦听txt
文件的ReadStream
。当调用上面的函数时,我看到文件的输出。但是,如果在调用getMatchingTests()
之后调用subscribe()
,如下所示:
async function promptHandler(source) {
source.subscribe(function(line) {
console.log(`line == ${line}`);
});
let matchingTests = await getMatchingTests('ROGL');
}
async function promptHandler(source) {
let matchingTests = await getMatchingTests('ROGL');
source.subscribe(function(line) {
console.log(`line == ${line}`);
});
}
我看不到txt文件的内容。我知道matchingTests变量包含getMatchingTests
的成功结果,所以我认为它不会阻止Node执行该行
我猜getMatchingTests
异步函数调用会影响source
的可观察性,但我不知道如何
这是我的源代码
代码:
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();});
});
我的直觉是,可观测的源是一个热点源,当
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();});
});
这样,流将仅在您订阅时创建和启动。您可以发布可观察源的代码吗?也许这有助于理解在控制台中为文件的每一行打印的
“数据”
会发生什么?如果你看到了,但是你没有看到任何像line===…
这样的文本,那么你的订阅操作肯定发生得太晚了。参考我的答案。我看不到“数据”
或行===…
对不起,你当然看不到。创建可观察对象时传递的函数仅在订阅时执行。因此,如果在发出/读取所有行之后订阅,那么文件流上就不再有data
事件。出于同样的原因,您也不会看到end
和error
。