From 4f5a7f1750ef57ea4729048e9031cfdf611f1b52 Mon Sep 17 00:00:00 2001 From: James Haggerty Date: Wed, 27 Jul 2016 18:52:41 +0000 Subject: [PATCH] Stop iteration on Request.eachitem returning false This echoes the behaviour of eachPage. --- .../next-release/feature-Request-fcc76298.json | 5 +++++ lib/request.js | 9 ++++++++- test/request.spec.coffee | 17 +++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 .changes/next-release/feature-Request-fcc76298.json diff --git a/.changes/next-release/feature-Request-fcc76298.json b/.changes/next-release/feature-Request-fcc76298.json new file mode 100644 index 0000000000..3e8525e70c --- /dev/null +++ b/.changes/next-release/feature-Request-fcc76298.json @@ -0,0 +1,5 @@ +{ + "type": "feature", + "category": "Request", + "description": "eachItem method stops iteration on returning false (like eachPage)" +} \ No newline at end of file diff --git a/lib/request.js b/lib/request.js index d1d796b549..d946abafc0 100644 --- a/lib/request.js +++ b/lib/request.js @@ -513,7 +513,14 @@ AWS.Request = inherit({ var resultKey = config.resultKey; if (Array.isArray(resultKey)) resultKey = resultKey[0]; var items = jmespath.search(data, resultKey); - AWS.util.arrayEach(items, function(item) { callback(null, item); }); + var continueIteration = true; + AWS.util.arrayEach(items, function(item) { + continueIteration = callback(null, item); + if (continueIteration === false) { + return AWS.util.abort; + } + }); + return continueIteration; } this.eachPage(wrappedCallback); diff --git a/test/request.spec.coffee b/test/request.spec.coffee index f6c0f848c5..9aa2b99d0c 100644 --- a/test/request.spec.coffee +++ b/test/request.spec.coffee @@ -192,6 +192,23 @@ describe 'AWS.Request', -> ] done() + it 'supports stopping responses if false is returned', -> + helpers.mockResponses [ + {data: {Results: [{Value: 1}, {Value: 2}], NextToken: 'a'}}, + {data: {Results: [{Value: 3}], NextToken: 'b'}}, + {data: Results: [{Value: 4}, {Value: 5}]} + ] + resps = [] + service.mockMethod().eachItem (err, data) -> + if resps.length == 2 + return false + resps.push([err, data]) + + expect(resps).to.eql [ + [null, {Value: 1}], + [null, {Value: 2}] + ] + it 'passes error to callback', (done) -> helpers.mockResponses [ {data: {Results: [{Value: 1}, {Value: 2}], NextToken: 'a'}},