2017-05-04 17 views
0

次のコードでは、async.seriesブロックが順番に実行されていません。nodejs:async.seriesが順番に機能を実行しない

var fs = require("fs"); 
var async = require("async"); 
var buffer = new Buffer(10); 
var read = ""; 
var readByt; 
async.series([ 
    function(callback) { 
     console.log("test"); 
     callback(); 
    }, 
    function(callback) { 
     fs.open('c:/ab.txt', 'r+', function(err, fd) { 
      fs.read(fd, buffer, 0, buffer.length, 0, function(err, bytes){ 
       read = buffer.slice(0, bytes).toString(); 
       readByt = bytes;   
       console.log("}}}"+read); 
       fs.close(fd, function(err){ 
        if (err){ 
        console.log(err); 
        } 
        console.log("File closed successfully.");   
       }) 
      }) 
     }) 
     callback(); 
    }, 
    function (callback){ 
     console.log("console:"+read); 
     console.log("console:"+read.substr(read.length-1)); 
     console.log("console:"+buffer.slice(0, readByt).toString()); 
     callback(); 
    } 
],function(){}); 

コマンドライン経由で実行すると、3番目のブロックのバッファ印刷がファイルの読み取り操作の前に行われます。

c:\>node fr.js 
test 
console: 
console: 
console: ?F  p? 
}}}c:/log.txt 
File closed successfully. 

これらを順番に実行するにはどうすればよいですか?

+0

の可能性のある重複した[Node.jsのをasync.seriesは、どのように動作するようになっているということです?](http://stackoverflow.com/questions/15969082/node-js-async-series-is-that -how-it-is-to-work-to-work) – John

答えて

1

あなたのコールバックは、非同期機能が完了するたびに呼び出されます。あなたの場合、fsアクションは非同期であり、後で完了します。 fsアクションが完了する前に、コールバックが呼び出されます。

これを試して、fs.closeの中でコールバックを呼び出してください。

var fs = require("fs"); 
var async = require("async"); 
var buffer = new Buffer(10); 
var read = ""; 
var readByt; 
async.series([ 
    function(callback) { 
     console.log("test"); 
     callback(); 
    }, 
    function(callback) { 
     fs.open('c:/ab.txt', 'r+', function(err, fd) { 
      fs.read(fd, buffer, 0, buffer.length, 0, function(err, bytes){ 
       read = buffer.slice(0, bytes).toString(); 
       readByt = bytes;   
       console.log("}}}"+read); 
       fs.close(fd, function(err){ 
        if (err){ 
        console.log(err); 
        } 
        console.log("File closed successfully."); 
        callback();   
       }) 
      }) 
     }) 
    }, 
    function (callback){ 
     console.log("console:"+read); 
     console.log("console:"+read.substr(read.length-1)); 
     console.log("console:"+buffer.slice(0, readByt).toString()); 
     callback(); 
    } 
],function(){}); 
+0

ありがとう@undefined - 非常によく定義された回答 - 完璧な作品 – BabyGroot

関連する問題