2017-03-13 16 views
2

ファイルを解凍し、さらに処理するために解凍されたファイルをさらに読むノードjs関数を書いています。問題は、ファイルが非同期で解凍される前に、read関数が開始され、ファイルが見つからないというエラーが発生して失敗することです。ファイルを読み込む前にプロセスの解凍を待つ方法を提案してください。非同期メソッドが終了するのを待つ

答えて

0

てくれてありがとう答え、私はそれに続くコードで働いている -

fs.createReadStream('master.zip') 
.pipe(unzip.Extract({ path: 'gitdownloads/repo' })) 
.on('close', function() { 
... 
}); 
2

はこちらをご覧ください:

https://blog.risingstack.com/node-hero-async-programming-in-node-js/

ノードヒーロー - Node.jsの

で理解非同期プログラミングがノードヒーローと呼ばれる。これは、チュートリアルシリーズの第三のポストである - ことができますこれらの章でNode.jsを使い始め、それを使ってソフトウェア製品を提供する方法を学んでください。

この章では、非同期プログラミングの原則について説明し、JavaScriptとNode.jsで非同期を行う方法を示します。

+0

ありがとう@EAK TEAM – geekintown

+0

あなたが役に立ったら、回答またはアップヴォートとして –

0

非同期ライブラリー(http://caolan.github.io/async/

このライブラリは、あなたが持っている機能のexecusionを制御するために使用されています。例えば

:解凍タスクはコールバックfuncionを呼び出した後

async.series({ 
    unzip: function(callback) { 
     unzip('package.zip', function(err, data) { 
      if(!err) 
       callback(null, data); 
     }); 
    } 
}, function(err, results) { 
    // results is now equal to: {unzip: data} 
    readingUnzipFiles(...); 
}); 

ここreadingUnzipFilesが実行されます。

Promisses

別の解決策は、Q(https://github.com/kriskowal/q)のようなpromisseモジュールを使用して次のようになります。

function unzip(fileName, outputPath) { 
    var deferred = Q.defer(); 

    fs.createReadStream(fileName) 
     .pipe(unzip.Extract({ path: outputPath })) 
     .on('end', function(){ 
      deferred.resolve(result); 
     }); 

    return deferred.promise; 
} 

その後、あなたのような機能を使用できます。

unzip('file.zip', '/output').then(function() { 
    processZipFiles(); 
}); 
+0

.Thanksと記入してください。私のunzip関数は、ファイルシステムに多くのファイルを書き込むので、すべてが書き込まれた後に処理するためにそれらを読みたいと思います。上の例でこれを解決できますか? – geekintown

+0

私は、各ファイルを書き込むためにfs.writeFile()関数を使用しています。すべてのファイルが書き込まれたときにコールバックを取得する方法です。ありがとうございます – geekintown

+0

あなたのコード実装を更新して見てみましょうか? –

関連する問題