From e61bf26b4452100c555408e4e647af0f571ce6a9 Mon Sep 17 00:00:00 2001 From: Joe Gornick Date: Thu, 13 Oct 2016 13:05:28 -0500 Subject: [PATCH] Update whilst and doWhilst to support promised arguments --- src/doWhilst.js | 5 +++-- src/whilst.js | 5 +++-- test/doWhilst.js | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ test/whilst.js | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 4 deletions(-) diff --git a/src/doWhilst.js b/src/doWhilst.js index f60fb71..ad7333d 100644 --- a/src/doWhilst.js +++ b/src/doWhilst.js @@ -1,11 +1,12 @@ import tryFn from './tryFn'; +import promised from './promised'; import whilst from './whilst'; -export default function doWhilst(task, condition, ...args) { +export default promised(function doWhilst(task, condition, ...args) { return tryFn(task, ...args) .then((result) => Array.isArray(result) ? whilst(condition, task, ...result) : whilst(condition, task, result) ); -}; +}); diff --git a/src/whilst.js b/src/whilst.js index ceb9306..bb1c565 100644 --- a/src/whilst.js +++ b/src/whilst.js @@ -1,6 +1,7 @@ import tryFn from './tryFn'; +import promised from './promised'; -export default function whilst(condition, task, ...args) { +export default promised(function whilst(condition, task, ...args) { return tryFn(condition, ...args) .then((conditionResult) => { return conditionResult @@ -12,4 +13,4 @@ export default function whilst(condition, task, ...args) { ) : Promise.resolve(); }); -}; +}); diff --git a/test/doWhilst.js b/test/doWhilst.js index 88152a4..e891bd1 100644 --- a/test/doWhilst.js +++ b/test/doWhilst.js @@ -103,6 +103,54 @@ describe('doWhilst', function() { ]); }); + it('supports promised arguments', function() { + let order = []; + const p = async.doWhilst( + new Promise(resolve => setTimeout( + resolve.bind( + null, + count => new Promise(resolve => setTimeout(_ => { + order.push(`task${count}`); + count++; + resolve(count); + }, 25)) + ), + 25 + )), + + new Promise(resolve => setTimeout( + resolve.bind( + null, + count => new Promise(resolve => setTimeout(_ => { + order.push(`condition${count}`); + resolve(count < 5); + }, 25)) + ), + 25 + )), + + + Promise.resolve(0) + ); + + return Promise.all([ + p.should.eventually.equal(undefined), + p.then(() => order.should.deep.equal([ + 'task0', + 'condition1', + 'task1', + 'condition2', + 'task2', + 'condition3', + 'task3', + 'condition4', + 'task4', + 'condition5' + ])) + ]); + }); + + it('rejects in delayed task', function() { let order = []; const p = async.doWhilst( diff --git a/test/whilst.js b/test/whilst.js index 41f7b66..c5d7a20 100644 --- a/test/whilst.js +++ b/test/whilst.js @@ -106,6 +106,53 @@ describe('whilst', function() { ]); }); + it('supports promised arguments', function() { + let order = []; + const p = async.whilst( + new Promise(resolve => setTimeout( + resolve.bind( + null, + count => new Promise(resolve => setTimeout(_ => { + order.push(`condition${count}`); + resolve(count < 5); + }, 25)) + ), + 25 + )), + + new Promise(resolve => setTimeout( + resolve.bind( + null, + count => new Promise(resolve => setTimeout(_ => { + order.push(`task${count}`); + count++; + resolve(count); + }, 25)) + ), + 25 + )), + + Promise.resolve(0) + ); + + return Promise.all([ + p.should.eventually.equal(undefined), + p.then(() => order.should.deep.equal([ + 'condition0', + 'task0', + 'condition1', + 'task1', + 'condition2', + 'task2', + 'condition3', + 'task3', + 'condition4', + 'task4', + 'condition5' + ])) + ]); + }); + it('rejects in delayed task', function() { let order = []; const p = async.whilst(