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