diff --git a/CHANGELOG.md b/CHANGELOG.md index fb4622f12b5..14c3d4c13f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -487,6 +487,7 @@ Released with 1.0.0-beta.37 code base. ### Fixed - Fix readthedoc's build for web3js documentation (#4425) + - Fix response sorting for batch requests (#4250) ### Changed diff --git a/packages/web3-core-requestmanager/src/batch.js b/packages/web3-core-requestmanager/src/batch.js index c47aaf7b9dd..72a3f0a6eab 100644 --- a/packages/web3-core-requestmanager/src/batch.js +++ b/packages/web3-core-requestmanager/src/batch.js @@ -47,8 +47,10 @@ Batch.prototype.add = function (request) { */ Batch.prototype.execute = function () { var requests = this.requests; + var sortResponses = this._sortResponses.bind(this); + this.requestManager.sendBatch(requests, function (err, results) { - results = results || []; + results = sortResponses(results); requests.map(function (request, index) { return results[index] || {}; }).forEach(function (result, index) { @@ -71,5 +73,10 @@ Batch.prototype.execute = function () { }); }; +// Sort responses +Batch.prototype._sortResponses = function (responses) { + return (responses || []).sort((a, b) => a.id - b.id); +} + module.exports = Batch; diff --git a/test/batch.js b/test/batch.js index 02e1798ce46..368cbad70e0 100644 --- a/test/batch.js +++ b/test/batch.js @@ -6,6 +6,25 @@ var FakeIpcProvider = require('./helpers/FakeIpcProvider'); describe('lib/web3/batch', function () { + describe('_sortResponses', function () { + it('should sort the responses in order of requests', function() { + var provider = new FakeIpcProvider(); + var web3 = new Web3(provider); + + var batch = new web3.BatchRequest(); + batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', () => {})); + batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000005', 'latest', () => {})); + + const res1 = {id: 1, result: 'res1'} + const res2 = {id: 2, result: 'res2'} + const res3 = {id: 3, result: 'res3'} + const sortedResponses = batch._sortResponses([res3, res1, res2]); + + assert.deepEqual(sortedResponses, [res1, res2, res3]); + batch.execute(); + }); + }); + describe('execute', function () { it('should execute batch request', function (done) {