我正在为使用网络服务的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()
});


希望对您有所帮助:)

09-25 17:34