2015-01-08 40 views
0

我是相當新的節點,並有一些麻煩解開一些回調地獄。我需要執行一系列涉及的操作 - 每個操作都有很多模塊中的很多回調代碼。但是這些操作需要串聯執行。我打破了這個玩具程序的真正混亂:使用異步序列化操作與節點js中的多個回調層

const 
    a = require('async'); 

var myasyncproc = function(cb) { 
    setTimeout(console.log('..boo') , 10000); 
    var str = require('fs').createReadStream('atest.js'); 
    str.on('data', function(data) { 
     console.log(data); 
    }) 
    str.on('end', function() { 
     cb(); 
    }); 
}; 

[1,2,3].forEach(function(i) {  
    a.series([ 
     function(callback) { 
     console.log('starting '); 
     myasyncproc(callback); 
     }, 
     function(callback) { 
      console.log('too'); 
      callback(null, 'too'); 
     }, 

     function(callback) { 
      console.log('tree'); 
      callback(null, 'done'); 
     } 
     ], function (err, result) { 
      console.log(result); 
     } 
    ); 
}); 

另外請注意,我需要執行此係列多次。在這裏,我剛剛使用了向量[1,2,3],但在我的實際應用中,這些值有我需要使用的值。如果你運行這個,你會看到myasyncproc在「too」和「tree」運行之前被調用了三次(開始)。

這很好,但是如何使用異步或其他技術來阻止調用myasyncproc直到'樹'完成?看起來像異步應該這樣做,但我不能完全吻出來...

謝謝!

+0

使用承諾 - 現在它有點成爲ecmascript控制流的標準。藍鳥是最快的實現 - https://github.com/petkaantonov/bluebird – alexpods

+0

由於您已經在使用'async'庫,請查看'async.forEachSeries'。 –

回答

0

我做了一個小重構,讓你開始:

var async = require('async'); 

var myasyncproc = function(cb) { 
    console.log('..boo') 
    var str = require('fs').createReadStream('atest.js'); 
    str.on('data', function(data) { 
     console.log(data); 
    }) 
    str.on('end', function() { 
     cb(null, 'end'); // if you do cb(), you will return undefined as result 
    }); 
}; 

var fns = [ 
     function(callback) { 
     console.log('starting '); 
     myasyncproc(callback); 
     }, 
     function(callback) { 
      console.log('too'); 
      callback(null, 'too'); 
     }, 

     function(callback) { 
      console.log('tree'); 
      callback(null, 'done'); 
     } 
     ]; 

var myItemArray = [1,2,3]; // just change this by your array of Item 

async.eachSeries(myItemArray, function(item, callback){ 

    async.series(fns , function (err, result) { 
      console.log(result); 
      callback(console.log("for item: "+item)) // callback needed to iterate 
    }); 
}, function(err){ 

}); 

下面是結果我在atest.js文件與「yooo」得到:

starting 
..boo 
<Buffer 20 79 6f 6f 6f 0a> // that's the data value 
too 
tree 
[ 'end', 'too', 'done' ] 
for item: 1 
starting 
..boo 
<Buffer 20 79 6f 6f 6f 0a> 
too 
tree 
[ 'end', 'too', 'done' ] 
for item: 2 
starting 
..boo 
<Buffer 20 79 6f 6f 6f 0a> 
too 
tree 
[ 'end', 'too', 'done' ] 

這是對你有好處?

Metux