forked from cujojs/when
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkeys.js
99 lines (83 loc) · 2.26 KB
/
keys.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/** @license MIT License (c) copyright 2011-2013 original author or authors */
/**
* Licensed under the MIT License at:
* http://www.opensource.org/licenses/mit-license.php
*
* @author Brian Cavalier
* @author John Hann
*/
(function(define) { 'use strict';
define(function(require) {
var when, promise, keys, eachKey, owns;
when = require('./when');
promise = when.promise;
// Public API
keys = {
all: all,
map: map
};
// Safe ownProp
owns = {}.hasOwnProperty;
// Use Object.keys if available, otherwise for..in
eachKey = Object.keys
? function(object, lambda) {
Object.keys(object).forEach(function(key) {
lambda(object[key], key);
});
}
: function(object, lambda) {
for(var key in object) {
if(owns.call(object, key)) {
lambda(object[key], key);
}
}
};
return keys;
/**
* Resolve all the key-value pairs in the supplied object or promise
* for an object.
* @param {Promise|object} object or promise for object whose key-value pairs
* will be resolved
* @returns {Promise} promise for an object with the fully resolved key-value pairs
*/
function all(object) {
return map(object, identity);
}
/**
* Map values in the supplied object's keys
* @param {Promise|object} object or promise for object whose key-value pairs
* will be reduced
* @param {function} mapFunc mapping function mapFunc(value) which may
* return either a promise or a value
* @returns {Promise} promise for an object with the mapped and fully
* resolved key-value pairs
*/
function map(object, mapFunc) {
return when(object, function(object) {
return promise(resolveMap);
function resolveMap(resolve, reject, notify) {
var results, toResolve;
results = {};
toResolve = 0;
eachKey(object, function(value, key) {
++toResolve;
when(value, mapFunc).then(function(mapped) {
results[key] = mapped;
if(!--toResolve) {
resolve(results);
}
}, reject, notify);
});
// If there are no keys, resolve immediately
if(!toResolve) {
resolve(results);
}
}
});
}
function identity(x) { return x; }
});
})(
typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }
// Boilerplate for AMD and Node
);