2017-08-12 14 views
0

私はnodejsを初めて使用していて、コーディング中に複数のcssファイルを実行中に猫にしようとしています。パッケージchokidarを使用すると、ファイルが変更されたときに関数を呼び出すことができますが、実行に問題があります。nodejsで正しい順序で命令が実行されない

var goconcat = 
    fs.readdir(paths, function (err, files) { 
     if (err) {console.log(err);} 
     fs.unlink(paths + 'concat.css', function (err) { 
     if (err) throw err; 
     var list = files.map(function (files) { 
      return path.join(paths, files); 
     }); 
     concat(list, paths + 'concat.css', function(err) { 
      if (err) throw err 
     }); 
     }); 
}); 

先ほどのファイルを削除してから、ディレクトリを読み取り、新しい「concat.css」を書きたいと思います。しかし、私はエラーがあります。

Error: ENOENT: no such file or directory, open 'public/css/concat.css' 
at error (native) 

関数CONCAT()はディレクトリ更新の前に実行されていることを表示されません後、したがって、それは猫にだけ削除されたファイルをしようとしています。どうして ?

私はnodejsが同期的な方法で機能を実行していることを知っていますが、私はこの問題を解決する方法を見つけることができません。私は非同期を試みたが、2つの関数の間で変数を宣言することはできず、それを動作させることができなかった。

+0

ただし、ハードコードの対象となる値と破損を開始する場所は決してわかりません。 –

答えて

0

コールバックに存在しない場合は、setTimeout(fn, 0)トリックを使用すると、変数割り当て後に実行されることがあります。

var goconcat = 
    fs.readdir(paths, function (err, files) { 
     if (err) {console.log(err);} 
     fs.unlink(paths + 'concat.css', function (err) { 
     if (err) throw err; 
     var list = files.map(function (files) { 
      return path.join(paths, files); 
     }); 
     setTimeout(function() { 
      concat(list, paths + 'concat.css', function(err) { 
      if (err) throw err 
     })}, 0); 
     }); 
}); 
+0

これは最もシンプルで、開発用のコードをブロックする心配がないので、私はあなたのソリューションを10msで使用していました。ありがとう! – WaspCo

0

Nodejsは非同期であり、ここでも同じことが起こっています。リンク解除が発生する前に、Concat関数が呼び出されています。あなたはアンリンク機能自体の内部のファイルをCONCATと、このようなことの同期を作ってみることができます -

var goconcat = 
    fs.readdir(paths, function (err, files) { 
     if (err) {console.log(err);} 
     fs.unlink(paths + 'concat.css', function (err) { 
     if (err) throw err; 
     var list = files.map(function (files) { 
      return path.join(paths, files); 
     }); 
     concat(list, paths + 'concat.css', function(err) { 
      if (err) throw err 
     }); 
     }); 
}); 

ないがあれば、私はまた、concat.cssはfs.statを使用して、それを削除する前に存在しているかいないかどうかを確認することをお勧め次に、削除と連結の通常のロジックが存在する場合は、他に連結のロジックを配置します。

希望すると助かります!

0

問題は、unlinkを呼び出して、ファイルが削除される前にconcat関数が呼び出されているという問題があります。ネストされたコールバックを持つことでこれを防ぐことができます。しかし、asyncのようなモジュールを使用し、Callback Hellを処理しないようにすれば、おそらくcontrol flowが良いでしょう。

以下は、asyncモジュールの使用例です。

var fs = require('fs'); 
var async = require('async'); 

var myDir = __dirname + '/data'; 

async.waterfall([function(callback) { 
    fs.readdir(myDir, 'utf-8', function(error, files) { 
     if (error) { 
      return callback(error); 
     } 

     return callback(null, files); 
    }); 
}, function(files, callback) { 
    fs.open(myDir + '/myFile', 'wx', function(error, f) { 
     if (error && error.code === 'EEXIST') { 
      return callback(null, 'EEXIST'); 
     } 

     return callback(null, 'CREATE'); 
    }); 
}, function(fileStatus, callback) { 
    if (fileStatus === 'EEXIST') { 
     console.log('File exists. Deleting file...'); 

     fs.unlink(myDir + '/myFile', function(error) { 
      if (error) { 
       return callback(error); 
      } else { 
       return callback(null); 
      } 
     }); 
    } else { 
     console.log('File does not exist...'); 

     return callback(null); 
    } 
}, function(callback) { 
    fs.writeFile(myDir + '/myFile', "Hello World", function(err) { 
     if(err) { 
      return callback(error); 
     } 

     return callback(null, 'File Created'); 
    }); 
}], function(error, results) { 
    console.error(error); 
    console.log(results); 
}); 

waterfall機能は、各アレイ内の次に、その結​​果を渡す一連の関数のタスクアレイ、 を実行します。ただし、 のタスクのいずれかが自分のコールバックにエラーを渡すと、次の関数は実行されず、 エラーでメインコールバックがただちに呼び出されます。

+0

私はあなたのソリューションを使って終了しませんでしたが、最も厳しいもののようです。私は非同期を使用しようとしましたが失敗しました。私の間違いを理解する助けとなりましたので、ありがとうございます。 – WaspCo

関連する問題