如何基于“内部状态”重定向流

时间:2014-07-27 21:26:19

标签: javascript node.js stream gulp

我正在为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时,永远不会做任何事情。 由于我是节点流的新手,我想我误解了一些东西。你们中的任何人都可以帮助我理解我在这里遇到的错误吗?

1 个答案:

答案 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()
});

我希望有帮助:)