我对节点很新,并且在解开一些回调地狱时遇到了一些麻烦。我需要执行一系列相关的操作 - 每个操作都有很多带有大量回调的模块中的代码。但这些操作需要连续执行。我把真正的混乱打破了这个玩具程序:
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应该这样做,但我不能完全理解它......
谢谢!
答案 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