使用异步来序列化节点js中多层回调的操作

时间:2015-01-08 01:01:43

标签: javascript node.js asynchronous

我对节点很新,并且在解开一些回调地狱时遇到了一些麻烦。我需要执行一系列相关的操作 - 每个操作都有很多带有大量回调的模块中的代码。但这些操作需要连续执行。我把真正的混乱打破了这个玩具程序:

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直到'tree'完成?看起来async应该这样做,但我不能完全理解它......

谢谢!

1 个答案:

答案 0 :(得分: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){

});

这是我得到的结果" yooo"在atest.js文件中:

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