我正在为gulp编写一个使用Web服务的插件,并根据响应执行其中一项操作。算法是这样的:
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时,永远不会做任何事情。 由于我是节点流的新手,我想我误解了一些东西。你们中的任何人都可以帮助我理解我在这里遇到的错误吗?
答案 0 :(得分:1)
当您致电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()
});
我希望有帮助:)