You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
Fix execution order
If the command_queue and the offline_queue holds commands, the offline_queue should be choosen instead of the command_queue.
This commit is contained in:
@@ -91,7 +91,8 @@ function callbackOrEmit (self, callback, err, res) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function replyInOrder (self, callback, err, res) {
|
function replyInOrder (self, callback, err, res) {
|
||||||
var command_obj = self.command_queue.peekBack() || self.offline_queue.peekBack();
|
// The offline queue has to be checked first, as there might be commands in both queues at the same time
|
||||||
|
var command_obj = self.offline_queue.peekBack() || self.command_queue.peekBack();
|
||||||
if (!command_obj) {
|
if (!command_obj) {
|
||||||
process.nextTick(function () {
|
process.nextTick(function () {
|
||||||
callbackOrEmit(self, callback, err, res);
|
callbackOrEmit(self, callback, err, res);
|
||||||
|
@@ -107,7 +107,7 @@ describe('utils.js', function () {
|
|||||||
emitted = false;
|
emitted = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('no elements in either queue. Reply in the next tick', function (done) {
|
it('no elements in either queue. Reply in the next tick with callback', function (done) {
|
||||||
var called = false;
|
var called = false;
|
||||||
utils.reply_in_order(clientMock, function () {
|
utils.reply_in_order(clientMock, function () {
|
||||||
called = true;
|
called = true;
|
||||||
@@ -116,7 +116,7 @@ describe('utils.js', function () {
|
|||||||
assert(!called);
|
assert(!called);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('no elements in either queue. Reply in the next tick', function (done) {
|
it('no elements in either queue. Reply in the next tick without callback', function (done) {
|
||||||
assert(!emitted);
|
assert(!emitted);
|
||||||
utils.reply_in_order(clientMock, null, new Error('tada'));
|
utils.reply_in_order(clientMock, null, new Error('tada'));
|
||||||
assert(!emitted);
|
assert(!emitted);
|
||||||
@@ -153,16 +153,21 @@ describe('utils.js', function () {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('elements in the offline queue. Reply after the offline queue is empty and respect the command_obj', function (done) {
|
it('elements in the offline queue and the command_queue. Reply all other commands got handled respect the command_obj', function (done) {
|
||||||
clientMock.command_queue.push(create_command_obj(), {});
|
clientMock.command_queue.push(create_command_obj(), create_command_obj());
|
||||||
utils.reply_in_order(clientMock, function () {
|
clientMock.offline_queue.push(create_command_obj(), {});
|
||||||
|
utils.reply_in_order(clientMock, function (err, res) {
|
||||||
assert.strictEqual(clientMock.command_queue.length, 0);
|
assert.strictEqual(clientMock.command_queue.length, 0);
|
||||||
|
assert.strictEqual(clientMock.offline_queue.length, 0);
|
||||||
assert(!emitted);
|
assert(!emitted);
|
||||||
assert.strictEqual(res_count, 1);
|
assert.strictEqual(res_count, 3);
|
||||||
done();
|
done();
|
||||||
}, null, null);
|
}, null, null);
|
||||||
|
while (clientMock.offline_queue.length) {
|
||||||
|
clientMock.command_queue.push(clientMock.offline_queue.shift());
|
||||||
|
}
|
||||||
while (clientMock.command_queue.length) {
|
while (clientMock.command_queue.length) {
|
||||||
clientMock.command_queue.shift().callback(null, 'bar');
|
clientMock.command_queue.shift().callback(null, 'hello world');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Reference in New Issue
Block a user