我想管道一个node.js流到输出文件。但是我还想确保在开始管道之前存在输出目的地。以下代码的问题是,来自管道的事件处理程序添加较晚(在调用assurePath
回调之后),因此数据在输入流中不再可用。我不希望使用sync fs方法来阻塞整个进程。
assurePath = (path, callback) ->
path = path.split path.sep
i = 0
async.eachSeries path[1...path.length-1], (segment, callback) =>
i++
p = path[0..i].join path.sep
fs.exists p, (exists) =>
return callback() if exists
fs.mkdir p, callback
,
callback
saveStream = (filename, stream, callback) ->
path = fullPath filename
assurePath path, (error) ->
return callback error if error
finished = false
stream.on('error', (error) ->
return if finished
finished = true
callback error
).pipe(
fs.createWriteStream path
).on('finish', ->
return if finished
finished = true
callback()
).on('error', (error) ->
return if finished
finished = true
callback error
)
你可以尝试在调用assurePath
之前暂停你的流,然后在回调中恢复它:
saveStream = (filename, stream, callback) ->
stream.pause()
path = fullPath filename
assurePath path, (error) ->
stream.resume()
# ...
调用.pause()
将导致stream
停止发出数据事件。任何可用的数据都将保留在内部缓冲区中。在assurePath
回调中调用.resume()
将导致stream
恢复发送数据事件。