diff options
Diffstat (limited to 'lib/_stream_writable.js')
-rw-r--r-- | lib/_stream_writable.js | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 615f5a3762..78ab13d906 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -374,18 +374,26 @@ function doWrite(stream, state, writev, len, chunk, encoding, cb) { function onwriteError(stream, state, sync, er, cb) { --state.pendingcb; - if (sync) - process.nextTick(afterError, stream, state, cb, er); - else - afterError(stream, state, cb, er); - - stream._writableState.errorEmitted = true; - stream.emit('error', er); -} -function afterError(stream, state, cb, err) { - cb(err); - finishMaybe(stream, state); + if (sync) { + // defer the callback if we are being called synchronously + // to avoid piling up things on the stack + process.nextTick(cb, er); + // this can emit finish, and it will always happen + // after error + process.nextTick(finishMaybe, stream, state); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + } else { + // the caller expect this to happen before if + // it is async + cb(er); + stream._writableState.errorEmitted = true; + stream.emit('error', er); + // this can emit finish, but finish must + // always follow error + finishMaybe(stream, state); + } } function onwriteStateUpdate(state) { |