diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 2dc949316a2dce..4b353a52665efa 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -415,27 +415,24 @@ function onwrite(stream, er) { onwriteError(stream, state, er, cb); } } else { - if (!state.destroyed) { + if (state.buffered.length > state.bufferedIndex) { clearBuffer(stream, state); } - if (state.needDrain || cb !== nop || state.ending || state.destroyed) { - if (sync) { - // It is a common case that the callback passed to .write() is always - // the same. In that case, we do not schedule a new nextTick(), but - // rather just increase a counter, to improve performance and avoid - // memory allocations. - if (state.afterWriteTickInfo !== null && - state.afterWriteTickInfo.cb === cb) { - state.afterWriteTickInfo.count++; - } else { - state.afterWriteTickInfo = { count: 1, cb, stream, state }; - process.nextTick(afterWriteTick, state.afterWriteTickInfo); - } + + if (sync) { + // It is a common case that the callback passed to .write() is always + // the same. In that case, we do not schedule a new nextTick(), but + // rather just increase a counter, to improve performance and avoid + // memory allocations. + if (state.afterWriteTickInfo !== null && + state.afterWriteTickInfo.cb === cb) { + state.afterWriteTickInfo.count++; } else { - afterWrite(stream, state, 1, cb); + state.afterWriteTickInfo = { count: 1, cb, stream, state }; + process.nextTick(afterWriteTick, state.afterWriteTickInfo); } } else { - state.pendingcb--; + afterWrite(stream, state, 1, cb); } } } @@ -483,7 +480,7 @@ function errorBuffer(state, err) { // If there's something in the buffer waiting, then process it. function clearBuffer(stream, state) { - if (state.corked || state.bufferProcessing) { + if (state.corked || state.bufferProcessing || state.destroyed) { return; }