2017-05-04 117 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(){}); 

在通过命令行执行时,第三个块中的缓冲区打印发生在文件读取操作之前。

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如何工作) – 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