2016-01-24 25 views
1

新手在這裏節點。我試圖下載一個.tar.xz文件,並將其解壓到通過代碼如下所示的目錄:爲什麼不在這個Node.js代碼中觸發'finish'事件?

var request = require('request'); 
var tar = require('tar'); 
var xz = require('xz'); 

function downloadRaw(url, callback) 
{ 
    return request({ 
     encoding: null, 
     url: url 
    }, callback); 
} 

function extractToDirectory(url, directory, callback) 
{ 
    return downloadRaw(url) 
     .pipe(new xz.Decompressor()) 
     .pipe(tar.Extract(directory)) 
     .on('finish', callback); 
} 

出於某種原因,'finish'事件的焦油流似乎並沒有被髮射,它完成後,即使提取檔案的內容。 tar是由npm自己維護的庫,所以我認爲我在這裏犯了一些錯誤。無論如何,爲什麼會發生這種情況,我該如何解決這個問題?

回答

0

原來,error事件被解僱,但不是finish。這固定它:

function extractToDirectory(url, directory, callback) 
{ 
    return downloadRaw(url) 
     .pipe(new xz.Decompressor()) 
     .pipe(tar.Extract(directory)) 
     .on('error', callback) 
     .on('finish', callback); 
} 
0

我看到downloadRaw需要回調,但是你永遠不會傳遞它,所以你傳遞一個未定義的值給請求函數。

如果你想使用流api,那麼不要將回調傳遞給這些函數。

事實上,爲什麼要打擾那些原始功能。爲什麼不只是做:

return request(url) 
.pipe(newxz.Decompressor()) 
.pipe(tar.Extract(directory)) 
.on('finish', callback); 
相關問題