From b0f79582992d776ecb47f2aa80e38f819c425d66 Mon Sep 17 00:00:00 2001 From: Juneidy Date: Thu, 27 Jun 2019 11:22:04 +0800 Subject: [PATCH] Fix hanging listener when error occured --- index.js | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 1984e468..d333e259 100644 --- a/index.js +++ b/index.js @@ -19,10 +19,23 @@ function Cursor (text, values, config) { this._cb = null this._rows = null this._portal = null + this._ifNoData = this._ifNoData.bind(this) + this._rowDescription = this._rowDescription.bind(this) } util.inherits(Cursor, EventEmitter) +Cursor.prototype._ifNoData = function () { + this.state = 'idle' + this._shiftQueue() +} + +Cursor.prototype._rowDescription = function () { + if (this.connection) { + this.connection.removeListener('noData', this._ifNoData) + } +} + Cursor.prototype.submit = function (connection) { this.connection = connection this._portal = 'C_' + (nextUniqueID++) @@ -45,19 +58,12 @@ Cursor.prototype.submit = function (connection) { con.flush() - const ifNoData = () => { - this.state = 'idle' - this._shiftQueue() - } - if (this._conf.types) { this._result._getTypeParser = this._conf.types.getTypeParser } - con.once('noData', ifNoData) - con.once('rowDescription', () => { - con.removeListener('noData', ifNoData) - }) + con.once('noData', this._ifNoData) + con.once('rowDescription', this._rowDescription) } Cursor.prototype._shiftQueue = function () { @@ -114,6 +120,8 @@ Cursor.prototype.handleEmptyQuery = function () { } Cursor.prototype.handleError = function (msg) { + this.connection.removeListener('noData', this._ifNoData) + this.connection.removeListener('rowDescription', this._rowDescription) this.state = 'error' this._error = msg // satisfy any waiting callback