async-mixin

caolin/async's collection methods as a mixin.

async-mixin

caolin/async collection methods as a mixin.

var admins = {
  userIds: [1,2,3,4,5]
}
 
// pass target object + path to the array you want to 
// enumerate over asynchronously 
var adminApi = asyncMixin(admins, 'userIds')
 
// adminApi has all of the async collection methods: 
Object.keys(adminApi) // each, eachSeries, eachLimit, map, ...etc 
 
// async methods work just like caolin/async's methods, 
// except they're automatically bound to admins' 'userIds' property 
adminApi.map(function(userIdnext) {
  // pretend this is how we load a user 
  db.load(userId, next)
}, function(errusers) {
  // users is an array of results from our async operation db.load! 
})
 
var admins = {
  userIds: [1,2,3,4,5]
}
 
var adminApi = asyncMixin(admins, 'userIds', ['map', 'filter'])
 
Object.keys(adminApi) // ['map', 'filter'] 
 
adminApi.map // => [Function] 
adminApi.filter // => [Function] 
adminApi.reduce // =>  
 
 
var asyncMixin = require('async-mixin')
 
var items = [1,2,3,4,5]
 
var container = asyncMixin(items)
 
// container now has all of async's methods 
// bound automatically to the passed-in items: 
container.map(function(itemnext) {
  return next(null, item * 2)
}, function(errresult) {
  console.log(result) // => [2, 4, 6, 8, 10] 
})
 
 
function UserCollection(users) {
  this.users = users
}
 
UserCollection.prototype = asyncMixin('users')
 
UserCollection.prototype.save = function save(done) {
  // pretend db.save is some async operation that saves users 
  this.forEach(db.save, done)
}
 
UserCollection.prototype.loadProfiles = function loadProfiles(done) {
  // pretend db.loadProfile is some async operation that loads user profiles 
  this.map(db.loadProfile, done)
}
 
var users = new UserCollection([{name: 'Bill'}, {name: 'Bob'}])
 
users.loadProfiles(function(errprofiles) {
  // profies will be an array of results from db.loadProfile 
})
 
users.save(function(err) {
  // if there was an error saving any user, 
  // err will contain that error 
})
 
  • each
  • eachSeries
  • eachLimit
  • map
  • mapSeries
  • mapLimit
  • filter
  • filterSeries
  • reject
  • rejectSeries
  • reduce
  • reduceRight
  • detect
  • detectSeries
  • sortBy
  • some
  • every
  • concat
  • concatSeries

async-mixin does not modify your original object, it simply returns a new object that inherits from your original object, while adding async methods:

var admins = {
  userIds: [1,2,3,4,5]
}
 
var adminApi = asyncMixin(admins, 'userIds')
 
adminApi.map // => [Function] 
admins.map //  =>  
 

Similar idea to component/enumerable, but our enumeration methods are asynchronous.

MIT