課程
/前端開(kāi)發(fā)
/Node.js
/進(jìn)擊Node.js基礎(chǔ)(二)
一直不懂要是最后一次讀取數(shù)據(jù)后 調(diào)用writerStream.end()時(shí) ?writerStream還沒(méi)寫(xiě)完怎么辦
2017-08-24
源自:進(jìn)擊Node.js基礎(chǔ)(二) 2-3
正在回答
var fs = require('fs');var readStream = fs.createReadStream('/path/to/source');var writeStream = fs.createWriteStream('/path/to/dest');readStream.on('data', function(chunk) { // 當(dāng)有數(shù)據(jù)流出時(shí),寫(xiě)入數(shù)據(jù) ? ?writeStream.write(chunk);});readStream.on('end', function() { // 當(dāng)沒(méi)有數(shù)據(jù)時(shí),關(guān)閉數(shù)據(jù)流 ? ?writeStream.end();});
上面的代碼就有一個(gè)問(wèn)題,要是寫(xiě)入速度跟不上讀取速度,就可能造成你說(shuō)的writeStream還沒(méi)寫(xiě)完就被關(guān)閉了。所以可以改成下面這種,我寫(xiě)完一段,你再讀取下一段。這里如果是最后一次讀取數(shù)據(jù),那么讀了之后,writeStream開(kāi)始寫(xiě),寫(xiě)完再通知readStream去讀數(shù)據(jù),可是這時(shí)readStream發(fā)現(xiàn)沒(méi)有數(shù)據(jù)可讀了,于是就觸發(fā)end事件的監(jiān)聽(tīng)器,它們才被關(guān)閉了
var fs = require('fs');var readStream = fs.createReadStream('/path/to/source');var writeStream = fs.createWriteStream('/path/to/dest');readStream.on('data', function(chunk) { // 當(dāng)有數(shù)據(jù)流出時(shí),寫(xiě)入數(shù)據(jù) ? ?if (writeStream.write(chunk) === false) { // 如果沒(méi)有寫(xiě)完,暫停讀取流 ? ? ? ?readStream.pause(); ? ?}});writeStream.on('drain', function() { // 寫(xiě)完后,繼續(xù)讀取 ? ?readStream.resume();});readStream.on('end', function() { // 當(dāng)沒(méi)有數(shù)據(jù)時(shí),關(guān)閉數(shù)據(jù)流 ? ?writeStream.end();});
舉報(bào)
本教程帶你攻破 Nodejs,讓 JavaScript流暢運(yùn)行在服務(wù)器端
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢(xún)優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2017-08-24
var fs = require('fs');var readStream = fs.createReadStream('/path/to/source');var writeStream = fs.createWriteStream('/path/to/dest');
readStream.on('data', function(chunk) { // 當(dāng)有數(shù)據(jù)流出時(shí),寫(xiě)入數(shù)據(jù)
? ?writeStream.write(chunk);
});
readStream.on('end', function() { // 當(dāng)沒(méi)有數(shù)據(jù)時(shí),關(guān)閉數(shù)據(jù)流
? ?writeStream.end();
});
上面的代碼就有一個(gè)問(wèn)題,要是寫(xiě)入速度跟不上讀取速度,就可能造成你說(shuō)的writeStream還沒(méi)寫(xiě)完就被關(guān)閉了。所以可以改成下面這種,我寫(xiě)完一段,你再讀取下一段。這里如果是最后一次讀取數(shù)據(jù),那么讀了之后,writeStream開(kāi)始寫(xiě),寫(xiě)完再通知readStream去讀數(shù)據(jù),可是這時(shí)readStream發(fā)現(xiàn)沒(méi)有數(shù)據(jù)可讀了,于是就觸發(fā)end事件的監(jiān)聽(tīng)器,它們才被關(guān)閉了
var fs = require('fs');var readStream = fs.createReadStream('/path/to/source');var writeStream = fs.createWriteStream('/path/to/dest');
readStream.on('data', function(chunk) { // 當(dāng)有數(shù)據(jù)流出時(shí),寫(xiě)入數(shù)據(jù)
? ?if (writeStream.write(chunk) === false) { // 如果沒(méi)有寫(xiě)完,暫停讀取流
? ? ? ?readStream.pause();
? ?}
});
writeStream.on('drain', function() { // 寫(xiě)完后,繼續(xù)讀取
? ?readStream.resume();
});
readStream.on('end', function() { // 當(dāng)沒(méi)有數(shù)據(jù)時(shí),關(guān)閉數(shù)據(jù)流
? ?writeStream.end();
});