我正在为使用网络服务的gulp编写插件,并根据响应做一件事或其他事情。该算法是这样的:
stream1 = through.obj(function(src, enc, cb) {
if src.is_a_buffer()
http_request(options)
http_request.on('response', function () {
if (statusCode = 200) {
/* Normal course, everything works fine here */
do_something()
return cb()
} else {
/* Exception course, although the stream2 is created, is never executed */
stream1.pipe(stream2())
}
}, function (cb) {
cb()
});
stream2 = through.obj(function(src,enc,cb) {
do_other_stuff()
stream2.push(src)
return cb()
}, function (cb) {
cb()
});
当我运行代码stream2时,从不执行。
由于我是节点流的新手,我认为我误会了一些东西。你们中的任何一个都可以帮助我了解我在这里做错什么吗?
最佳答案
当您调用stream1.pipe(stream2())
时,stream1
已经发出了数据(可能是所有数据)。进行该调用不会将执行传递给stream2
。有两种方法可以根据您的需要进行处理:
注意:我只是在这里修改原始的伪代码
选项1:
不用理会stream2
,只需直接致电do_other_stuff()
:
stream1 = through.obj(function(src, enc, cb) {
if src.is_a_buffer()
http_request(options)
http_request.on('response', function () {
if (statusCode = 200) {
/* Normal course, everything works fine here */
do_something()
cb()
} else {
do_other_stuff()
cb()
}
}, function (cb) {
cb()
});
选项2:
如果您需要
stream2
用于其他目的,请将through.obj()
回调拉入其自己的可调用函数中,然后直接从else子句中调用它。stream1 = through.obj(function(src, enc, cb) {
if src.is_a_buffer()
http_request(options)
http_request.on('response', function () {
if (statusCode = 200) {
/* Normal course, everything works fine here */
do_something()
return cb()
} else {
processStream2(src, enc, cb)
}
}, function (cb) {
cb()
});
function processStream2(src, enc, cb) {
do_other_stuff()
return cb()
}
stream2 = through.obj(processStream2, function (cb) {
cb()
});
希望对您有所帮助:)