Merge pull request #117 from vatesfr/promise-settle

Implement utils.pSettle().
This commit is contained in:
Julien Fontanet 2015-11-06 14:51:56 +01:00
commit 1e5f13795c
2 changed files with 54 additions and 1 deletions

View File

@ -106,6 +106,32 @@ export function pFinally (cb) {
) )
} }
// Given an array which contains promises return a promise that is
// fulfilled when all the items in the array are either fulfilled or
// rejected.
export function pSettle (promises) {
const statuses = promises.map(promise => promise.then(
value => ({
isFulfilled: () => true,
isRejected: () => false,
value: () => value,
reason: () => {
throw new Error('no reason, the promise has been fulfilled')
}
}),
reason => ({
isFulfilled: () => false,
isRejected: () => true,
value: () => {
throw new Error('no value, the promise has been rejected')
},
reason: () => reason
})
))
return Promise.all(statuses)
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
export { export {

View File

@ -13,7 +13,8 @@ import {
formatXml, formatXml,
generateToken, generateToken,
parseSize, parseSize,
pFinally pFinally,
pSettle
} from './utils' } from './utils'
// =================================================================== // ===================================================================
@ -170,3 +171,29 @@ describe('pFinally()', () => {
expect(spy.callCount).to.equal(1) expect(spy.callCount).to.equal(1)
}) })
}) })
// -------------------------------------------------------------------
describe('pSettle()', () => {
it('makes an array of PromiseInspection', async () => {
const [
status1,
status2
] = await pSettle([
Promise.resolve(42),
Promise.reject('fatality')
])
expect(status1.isRejected()).to.equal(false)
expect(status2.isRejected()).to.equal(true)
expect(status1.isFulfilled()).to.equal(true)
expect(status2.isFulfilled()).to.equal(false)
expect(status1.value()).to.equal(42)
expect(::status2.value).to.throw()
expect(::status1.reason).to.throw()
expect(status2.reason()).to.equal('fatality')
})
})