我寫了一些代碼,在Node v14.15.1中正按照我想要的方式作業,但我并不完全理解它是如何作業的。 下面是:
const rows = await new Promise(resolve => {
const result = [];
const file = fs.createReadStream('src/tests/readability/input.csv')。
const reader = file.pipe(csv()) 。
reader.on('data', row => {
result.push(row)。
});
reader.on('end', ( ) => {
resolve(結果)。
});
});
我的問題是,事件發射器何時開始發射事件并呼叫回呼函式? 因為在任何時候我都沒有呼叫任何型別的start()函式。 我使用reader.on()分配回呼函式,然后CSV檔案就被讀取了。 為什么在我有機會分配回呼函式之前,它沒有開始讀取檔案,從而使我錯過了事件的開始,甚至是所有的事件?
uj5u.com熱心網友回復:
當你附加data處理程式時,流將開始發射資料
https://nodejs.org/api/stream.html#stream_event_data
將 "data "事件監聽器附加到一個沒有明確暫停的流上,將使該流進入流動模式。一旦資料可用,它就會被傳遞。
https://areknawo.com/node-js-file-streams-explained/
流動模式
"流動模式 "在性質上肯定要復雜一些。在這里,.read()方法被自動呼叫,只讓你在 "data "事件中消耗給定的資料,在.read()呼叫后立即發出,并有一個新的資料塊。
// ...
readable.on("data", dataChunk =>/span> {
//code
});
此外,"流動模式 "有一個內置的保障措施,如果沒有合適的處理程式,它可以防止資料被自動讀取。因此,只有當你添加你的 "資料 "事件處理程式時,資料才會開始流動。如前所述,這也使得從 "暫停 "到 "流動 "的模式發生了轉換。不過,你仍然需要小心謹慎! 在沒有 "data "事件處理程式的情況下呼叫.resume()方法,或者洗掉處理程式,將不會停止讀取程序,并將導致資料丟失!
在 "data "事件處理程式的情況下呼叫.resume()方法,或者洗掉處理程式,將不會停止讀取程序,并將導致資料丟失
uj5u.com熱心網友回復:
為了了解事件發射器何時被觸發,首先你需要了解事件回圈在Javascript中是如何作業的,這在視頻中解釋過。
基本上當代碼運行時,當它遇到
const file = fs.createReadStream('src/tests/readability/input.csv');
它被傳遞到Web API上,即使資料在當時是可用的,它也只會作為一個新的條目進入事件回圈,所以它需要等待所有的條目才會被執行。當條目被執行時,它將已經有回呼函式附加到相應的條目。
reader.on('data', row => {result.push(row);});reader.on('end', ()=> {resolve(result);});
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318045.html
標籤:
