-
Notifications
You must be signed in to change notification settings - Fork 2
/
autoPromise.js
79 lines (70 loc) · 1.96 KB
/
autoPromise.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
const async = require('async');
const _ = require('lodash');
module.exports = (properties) => {
const methods = {};
for (const propertyName in properties) {
const property = properties[propertyName];
if (property && property.then && property.catch) { // isPromise
methods[propertyName] = (cb) => {
property.then(result => {
cb(null, result);
}).catch(cb);
};
} else if (_.isArray(property)) {
const lastItemIndex = property.length - 1;
const lastItem = property[lastItemIndex];
methods[propertyName] = [];
for (let i = 0; i < lastItemIndex; i++) {
methods[propertyName].push(property[i]);
}
methods[propertyName].push((results, cb) => {
try {
const lastItemResult = lastItem(results);
if (lastItemResult) {
if (lastItemResult.then && lastItemResult.catch) {
lastItemResult.then(result => {
cb(null, result);
}).catch(cb);
} else {
cb(null, lastItemResult);
}
} else {
cb();
}
} catch (err) {
cb(err);
}
});
} else {
methods[propertyName] = cb => {
property().then(result => {
cb(null, result);
}).catch(cb);
};
}
}
return new Promise((resolve, reject) => {
async.auto(methods, (err, results) => {
if (err) return reject(err);
resolve(results);
});
});
};
//sample code
// async.autoPromise({
// a: (cb) => {
// cb(null, 2);
// },
// b: Promise.resolve(3),
// c: ['a', 'b', (results) => {
// return new Promise((resolve, reject) => {
// setTimeout(() => {
// resolve(results.a + results.b);
// });
// });
// }]
// }).then((results) => {
// console.log(results);
// }).catch((err) => {
// console.log('err', err);
// });