2015-12-02 63 views
2

我有一些代碼,看起來像這樣:如果我在調用異步函數後調用它,爲什麼我的Observer訂戶沒有運行?

async function promptHandler(source) { 
    source.subscribe(function(line) { 
     console.log(`line == ${line}`); 
    }); 
    let matchingTests = await getMatchingTests('ROGL'); 
} 

這樣就會打印出source可觀的,這是聽txt文件的ReadStream的內容。當上面的函數被調用時,我會看到文件的輸出。但是,如果我叫subscribe()getMatchingTests()被調用,就像這樣:

async function promptHandler(source) { 
    let matchingTests = await getMatchingTests('ROGL'); 
    source.subscribe(function(line) { 
     console.log(`line == ${line}`); 
    }); 
} 

我沒有看到txt文件的內容。我知道matchingTests變量包含getMatchingTests的成功結果,所以我不認爲它會阻止Node執行該行。

我在猜測getMatchingTests異步函數調用與source Observable有關,但我沒有看到如何。

這裏是我的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();}); 
}); 
+0

你能發佈可觀察源代碼嗎?也許這可能有助於理解 – user3743222

+0

發生了什麼,但是您是否仍然在控制檯中爲文件的每一行打印了「data」?如果你這樣做了,但你沒有看到像'line === ...'這樣的文本,那麼你的訂閱操作肯定發生得太晚了。參看我的答案。 – user3743222

+0

我沒有看到''data''或'line === ...' –

回答

1

在這裏,我的直覺是,源觀察到的是一個熱源,並通過時間await已與匹配檢查恢復,您的文本文件已經被讀取。所以當你訂閱這個時候,沒有線條可以閱讀,它們在你訂閱源代碼之前就已經閱讀了。

UPDATE: 鑑於你的代碼,如果順序是爲您的使用情況的問題,可以考慮將FILESTREAM創建到觀察的工廠,即

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

這樣一來,流將被創建並且只有在您訂閱時纔會啓動。

相關問題