2017-05-19 13 views
0

expressunirest、およびasyncのモジュールを使用するコードブロックに状態情報ログを書き込もうとしています。nodejs/js:ファイルが順番にファイルに追加されない

const fsTest = require("fs"); 

app.post(someURL, function (req, res) { 
    fsTest.appendFile("c:/fs.txt","\r\nInOf") 
    async.series({ 
     one: function (callback) { 
       fsTest.appendFile("c:/fs.txt","\r\nInOf2") 
       someOperation();   
       fsTest.appendFile("c:/fs.txt","\r\nInOf3") 
       callback(false,"");   
     }, 
     //form search query 
     two: function (callback) { 
      fsTest.appendFile("c:/fs.txt","\r\nInOf4") 
      anotherOperation(); 
      urClient.post("https://" + server + url) 
       .header('Content-Type', 'application/json')    
       .send(qrySearchJSON) 
       .end(
        function (response) { 
        }); 
     } 
    }, function (err,oResp) { 
      errHandler(); 
     }); 
}); 

しかし、以下に示すように、私のログは、常にシーケンスのうち、表示されます。

InOf2 
InOf4 
InOf3 
InOf 

InOf 
InOf2 
InOf3 
InOf4 

InOf 
InOf2 
InOf4 
InOf3 

InOf2 
InOf 
InOf4 
InOf3 

InOf 
InOf2 
InOf3 
InOf4 

何を、おそらく理由かもしれないとどのようなアプローチで、私はそれを修正するために取るべきです。

答えて

1

fs.appendFile()が非同期であるためです。一方、あなたはそれが同期しているかのように実行します。

もっとも簡単な解決策は、fs.appendFileSync()を使用することです。これは、期待通りに動作します。

appendFileの非同期性を処理した方が良いでしょう。

const fsTest = require("fs"); 

app.post(someURL, function (req, res) { 
    fsTest.appendFile("c:/fs.txt","\r\nInOf") 
    async.series({ 
     one: function (callback) { 
       appendFile("c:/fs.txt","\r\nInOf2").then(function(){ 
        someOperation(); 
        return appendFile("c:/fs.txt","\r\nInOf3"); 
       }).then(function(){ 
        callback(false,"");   
       }).catch(function(err){}) 
     }, 
     //form search query 
     two: function (callback) { 
      appendFile("c:/fs.txt","\r\nInOf4").then(function(){ 
       anotherOperation(); 
       urClient.post("https://" + server + url) 
        .header('Content-Type', 'application/json')    
        .send(qrySearchJSON) 
        .end(
         function (response) { 
         }); 
      }).catch(function(err){}); 
     } 
    }, function (err,oResp) { 
      errHandler(); 
     }); 
}); 

function appendFile(file, content) { 
    var promise = new Promise(function(resolve, reject) { 
     fsTest.appendFile(file, content, function(err) { 
      if (err) { 
       reject(err); 
      } else { 
       resolve(); 
      } 
     }); 
    }); 

    return promise 
} 

代わりにasync/await、またはgeneratorsを使用できます。
co npmモジュールをご覧ください。これはいくつかの面白いものです。

+0

こんにちは@strah - 私もそれを見つけましたが、いくつかのより良いオプションを提案することができます – BabyGroot

+0

私はいくつかのサンプルコードを追加しました。 – strah

関連する問題