snowyu/promise-sequence.js

View on GitHub
src/some.js

Summary

Maintainability
A
0 mins
Test Coverage
var promiseReduce = Promise.reduce || require('./reduce').default;
// var Promise   = require('any-promise');
var isArray   = Array.isArray;

/*
  @param aList {Array} each item as argument pass to the task.
  @param total {Number} optional
  @param task {Promise} promise of task function
*/
function _undefined(i){
  return (i !== void 0);
}

function some(aList, total, task){
  function _genReduceFn(fn) {
    return function (previous, item){
      previous = previous.filter(_undefined);
      if (!total || previous.length < total) {
        previous = Promise.all(previous.concat(fn ? Promise.resolve(item).then(function(item){return fn(item)}) : item)).then(function (result) {
          return result.filter(_undefined)
        });
      }
      return previous;
    };
  }

  if (typeof total !== 'number') {
    task        = total;
    total       = null;
  }

  return promiseReduce(aList, _genReduceFn(task), []);
};

module.exports = some
module.exports.default = some