慕田峪4524236
2019-03-19 18:44:41
當前目錄下準備一個test.txt, 寫入一些東西, 比如>It's for test<分別執(zhí)行代碼:注釋掉延時為 3 ms的代碼塊, 輸出dest.txt, 內(nèi)容為>It's for test<注釋掉延時為 2 ms的代碼塊, 輸出dest.txt, 內(nèi)容為>It's for test<>It's for test<以下為代碼const fs = require('fs')const from = fs.createReadStream('test.txt')const to = fs.createWriteStream('dest.txt', {
flags: 'a'})from.pipe(to, {
end: false})from.on('end', () => { console.log('end')
})// setTimeout(() => {// from.pipe(to)//this won't work, if time >= 3// }, 3)// setTimeout(() => {// from.pipe(to)//this will work, if time < 3// }, 2)只觸發(fā)end事件一次不同時間延遲, 輸出不同, 行為十分詭異, 求解釋?
2 回答

斯蒂芬大帝
TA貢獻1827條經(jīng)驗 獲得超8個贊
通過I/O
讀取字符串到緩沖區(qū)
timers
階段沒有callback
執(zhí)行,寫入WriteStream
,timers
階段檢測到callback
,執(zhí)行callback
,然鵝ReadStream
沒數(shù)據(jù),pipe
沒有效果。timers
階段檢測到callback
,執(zhí)行callback
,ReadStream
數(shù)據(jù)還在,pipe
有效果。
用process.stdout
測試
const fs = require('fs')const from = fs.createReadStream('test.txt')from.pipe(process.stdout, { end: false})from.on('end', () => { console.log('end') }) setTimeout(() => { console.log('timer callback') from.pipe(process.stdout) //this won't work, if time >= 3}, 3)// setTimeout(() => {// console.log('timer callback')// from.pipe(process.stdout) //this will work, if time < 3// }, 2)

紅糖糍粑
TA貢獻1815條經(jīng)驗 獲得超6個贊
默認情況下, 在源流發(fā)出時stream.end()在目標Writable流上調(diào)用,以便目標不再可寫。要禁用此默認行為, 可以將該選項作為傳遞,從而使目標流保持打開狀態(tài):
reader.pipe(writer, { end: false });
上面說的很清楚了,設(shè)置false是保持打開狀態(tài),不是你理解的可以一直編輯,也是有時間限制的
由于Js是異步處理,所有程序同步執(zhí)行,寫入和settimeout也一樣,所以當你設(shè)置延遲時長高的時候,是沒辦法注入進去的。
謝謝
添加回答
舉報
0/150
提交
取消