如果我在调用异步函数后调用它,为什么我的Observer订阅者没有运行?

时间:2015-12-02 22:30:01

标签: javascript asynchronous observable rxjs

我有一些看起来像这样的代码:

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}}

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();});
});

这样,只有在订阅时才会创建并启动流。