Skip to content

Commit

Permalink
Added serializer to helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
adrenalin committed Feb 23, 2020
1 parent c75443b commit aa84c10
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 2 deletions.
5 changes: 3 additions & 2 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@ exports.getValue = require('./lib/getValue')
exports.isObject = require('./lib/isObject')
exports.merge = require('./lib/merge')
exports.parseQueryString = require('./lib/parseQueryString')
exports.serializer = require('./lib/serializer')
exports.splitStringIntoChunks = require('./lib/splitStringIntoChunks')
exports.strPad = require('./lib/strPad')
exports.trim = require('./lib/trim')
exports.unique = require('./lib/unique')
exports.splitStringIntoChunks = require('./lib/splitStringIntoChunks')
exports.typecastString = require('./lib/typecastString')
exports.unique = require('./lib/unique')

exports.config = require('./lib/config').config
exports.Config = require('./lib/config').default
Expand Down
34 changes: 34 additions & 0 deletions lib/serializer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/**
* Serializer creates a pipe of consequent promises, resolving with the values
* of each successful promise or rejecting with the last error
*
* @param { array } data Segments for each promise
* @param { function } fn Serializer function
* @return { Promise } Promise
*/
module.exports = function serializer (tasks, fn) {
tasks = tasks.slice()
let i = 0
const values = []

return new Promise((resolve, reject) => {
const serializer = () => {
if (!tasks.length) {
return resolve(values)
}

const task = tasks.splice(0, 1)[0]

Promise.resolve(fn(task, i++))
.then((response) => {
values.push(response)
serializer()
})
.catch((err) => {
reject(err)
})
}

serializer()
})
}
50 changes: 50 additions & 0 deletions tests/serializer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
const expect = require('expect.js')
const serializer = require('../lib/serializer')

describe('serializer', () => {
it('should return a promise', (done) => {
expect(serializer([])).to.be.a(Promise)
done()
})

it('should resolve the promises in chain and return all the resolved values as an array', (done) => {
const data = [0, 1, 2, 3]

serializer(data, (item, i) => {
if (item !== data[i]) {
return Promise.reject(new Error('Did not loop in chain'))
}

return Promise.resolve(item)
})
.then((response) => {
expect(response).to.eql(data)
done()
})
.catch(done)
})

it('should stop the serializer chain when callback rejects', (done) => {
const data = [0, 1, 2, 3]
let counter = 0

serializer(data, (item, i) => {
if (i === 2) {
return Promise.reject(new Error('Rejecting on purpose'))
}

counter++
})
.then(() => {
done(new Error('Should have rejected the chain'))
})
.catch((err) => {
if (counter !== 2) {
err.message = 'Counter mismatch'
return done(err)
}

done()
})
})
})

0 comments on commit aa84c10

Please sign in to comment.