2017-09-25 5 views
0

fs.unlinkを使用してsomefilesを削除していて、いくつかのコードを実行します。 JSの非同期性のために、何が起こっているのかは、リンク解除後のコードがリンク解除のコールバックの前に呼び出されるということです。どのように私はこれをSyncroniseできますか?約束は唯一の方法ですか?nodejs:コードの同期化

fs.unlink("FileName",function(err){ 
    console.log("RUN"); 
}) 

for(let i = 0; i<10;i++) { 
    console.log(i); 
} 

結果:私は削除する多くのファイルを持っている場合は、私は約束のカウントを維持する必要があり、その後解決されているどのように多くのチェックします:

1 
2 
3 
4 
5 
6 
7 
8 
9 
RUN 

約束を使用してに問題があることです。これは私がこのような状況では

+0

可能な重複https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an -asynchronous-call) –

+0

コールバック内でループを移動するだけですか? – Bergi

+0

あなたの約束の問題に対する答えは 'Promise.all'です。コールバックを手動でカウントするよりも、実際にはかなり簡単です。 – Bergi

答えて

3

を避けたい、あなたはfs.unlinkSyncを使用することができ、fs.unlinkの同期バージョン:@Keithとして

try { 
    fs.unlinkSync("FileName"); 
    console.log('Removing file successful!'); 
} catch(e) { 
    // TODO: handle errors here 
}; 

console.log("RUN"); 

for(let i = 0; i<10;i++) { 
    console.log(i); 
} 

は当然のコメントで言及:このような同期操作は慎重に使用する必要があります。削除するファイルの数が多い場合は、非同期fs.unlink()を使用する方が良いかもしれません。なぜならそれらを同時に「開始」することができるからです(トレードオフ:開始が多すぎ、I/O飽和のためにパフォーマンスが低下する可能性があります)。

+0

try文がエラーを出さないときにconsole.logにしたい場合はどうすればいいですか?私は成功したファイルの削除を印刷したいのですが、 –

+0

@BhumiSinghalは編集を参照してください、それは基本的に 'console.log()'ステートメントです_inside_ 'try'ブロック。 – robertklep

+0

この解決法は実際にはスケール能力について健康警告を必要とします。:) – Keith

0

プロミスは唯一の方法ではありません。関数内でforループをラップし、その関数をunlinkコールバックから呼び出すことができます。

new Promise((resolve, reject) => { 
    fs.unlink("FileName",function(err){ 
     console.log("RUN"); 
     return resolve(); 
    }); 
}) 
.then(() => { 
    for(let i = 0; i<10;i++) { 
     console.log(i); 
    } 
}); 

しかし、@robertklepが言うように、あなたのコードが非同期を必要としない場合は、単に同期関数を呼び出す:あなたはこの方法を行うと約束して一方

fs.unlink("FileName",function(err){ 
    console.log("RUN"); 
    loop(); 
}) 

function loop() { 
    for(let i = 0; i<10;i++) { 
     console.log(i); 
    } 
} 

、。 Promisesを使用して

2

は良い解決策である、あなたが約束を自分で追跡する必要はありません、bluebirdはあなたのためにそれを行います。

const Promise = require('bluebird'); 

function unlinkFile(fileName) { 
    return new Promise((resolve, reject) => { 
     fs.unlink(fileName, function (err) { 
      if (err) { 
       return reject(err); 
      } 
      resolve(); 
     }); 
    }); 
} 

Promise.all([unlinkFile('01.txt'), unlinkFile('02.txt'), unlinkFile('03.txt')]) 
    .then(() => { 
     console.log('ALL FILES UNLINKED'); 
    }); 

// OR YOU CAN USE promise.map 

const filesToUnlink = ['01.txt', '02.txt', '3.txt']; 
Promise.map(filesToUnlink, unlinkFile) 
    .then(() => { 
     console.log('ALL FILES UNLINKED'); 
    }); 
+1

Bluebirdを使用する場合は、約束する。 'var unlinkFile = Promise.promisify(fs.unlink)'を実行するだけです。 – Keith

0

あなたが適切な結果を得るために約束を使用する必要があります。

let fs = require('fs'); 
new Promise((resolve,reject) => { 
    fs.unlink("demo1.txt", function (err) { 
     console.log("RUN"); 
     if(err) 
      reject(err); 
     resolve(); 
    }) 
}) 
.then(() => { 
     for (let i = 0; i < 10; i++) { 
      console.log(i); 
     } 
    },(error)=>{ 
     console.log(error); 
    }) 
[私は非同期呼び出しからの応答を返すにはどうしますか?](の