Skip to content

Commit 2a6e68d

Browse files
Brian DeteringBrian Detering
authored andcommitted
swap Q for Bluebird promises, refactor test suite to favor returning promises instead of done callback
1 parent b5c3415 commit 2a6e68d

File tree

3 files changed

+126
-205
lines changed

3 files changed

+126
-205
lines changed

index.js

Lines changed: 48 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
const _ = require('lodash');
2-
const Q = require('q');
2+
const Promise = require('bluebird');
33
const DataLoader = require('dataloader');
44

55
module.exports = fig => {
66
const redis = fig.redis;
77

88
const parse = (resp, opt) =>
9-
Q.Promise((resolve, reject) => {
9+
new Promise((resolve, reject) => {
1010
try {
1111
if (resp === '' || resp === null) {
1212
resolve(resp);
@@ -22,56 +22,57 @@ module.exports = fig => {
2222

2323
const toString = (val, opt) => {
2424
if (val === null) {
25-
return Q('');
25+
return Promise.resolve('');
2626
} else if (opt.serialize) {
27-
return Q(opt.serialize(val));
27+
return Promise.resolve(opt.serialize(val));
2828
} else if (_.isObject(val)) {
29-
return Q(JSON.stringify(val));
29+
return Promise.resolve(JSON.stringify(val));
3030
} else {
31-
return Q.reject(new Error('Must be Object or Null'));
31+
return Promise.reject(new Error('Must be Object or Null'));
3232
}
3333
};
3434

3535
const makeKey = (keySpace, key) => `${keySpace}:${key}`;
3636

3737
const rSetAndGet = (keySpace, key, rawVal, opt) =>
38-
toString(rawVal, opt).then(val =>
39-
Q.Promise((resolve, reject) => {
40-
const fullKey = makeKey(keySpace, key);
41-
const multi = redis.multi();
42-
multi.set(fullKey, val);
43-
if (opt.expire) {
44-
multi.expire(fullKey, opt.expire);
45-
}
46-
multi.get(fullKey);
47-
multi.exec(
48-
(err, replies) =>
49-
err ? reject(err) : parse(_.last(replies), opt).then(resolve)
50-
);
51-
})
38+
toString(rawVal, opt).then(
39+
val =>
40+
new Promise((resolve, reject) => {
41+
const fullKey = makeKey(keySpace, key);
42+
const multi = redis.multi();
43+
multi.set(fullKey, val);
44+
if (opt.expire) {
45+
multi.expire(fullKey, opt.expire);
46+
}
47+
multi.get(fullKey);
48+
multi.exec(
49+
(err, replies) =>
50+
err ? reject(err) : parse(_.last(replies), opt).then(resolve)
51+
);
52+
})
5253
);
5354

5455
const rGet = (keySpace, key, opt) =>
55-
Q.Promise((resolve, reject) =>
56+
new Promise((resolve, reject) =>
5657
redis.get(
5758
makeKey(keySpace, key),
5859
(err, result) => (err ? reject(err) : parse(result, opt).then(resolve))
5960
)
6061
);
6162

6263
const rMGet = (keySpace, keys, opt) =>
63-
Q.Promise((resolve, reject) =>
64+
new Promise((resolve, reject) =>
6465
redis.mget(
6566
_.map(keys, k => makeKey(keySpace, k)),
6667
(err, results) =>
6768
err
6869
? reject(err)
69-
: Q.all(_.map(results, r => parse(r, opt))).then(resolve)
70+
: Promise.map(results, r => parse(r, opt)).then(resolve)
7071
)
7172
);
7273

7374
const rDel = (keySpace, key) =>
74-
Q.Promise((resolve, reject) =>
75+
new Promise((resolve, reject) =>
7576
redis.del(
7677
makeKey(keySpace, key),
7778
(err, resp) => (err ? reject(err) : resolve(resp))
@@ -86,44 +87,42 @@ module.exports = fig => {
8687
this.loader = new DataLoader(
8788
keys =>
8889
rMGet(this.keySpace, keys, this.opt).then(results =>
89-
Q.all(
90-
_.map(results, (v, i) => {
91-
if (v === '') {
92-
return Q(null);
93-
} else if (v === null) {
94-
return userLoader
95-
.load(keys[i])
96-
.then(resp =>
97-
rSetAndGet(this.keySpace, keys[i], resp, this.opt)
98-
)
99-
.then(r => (r === '' ? null : r));
100-
} else {
101-
return Q(v);
102-
}
103-
})
104-
)
90+
Promise.map(results, (v, i) => {
91+
if (v === '') {
92+
return Promise.resolve(null);
93+
} else if (v === null) {
94+
return userLoader
95+
.load(keys[i])
96+
.then(resp =>
97+
rSetAndGet(this.keySpace, keys[i], resp, this.opt)
98+
)
99+
.then(r => (r === '' ? null : r));
100+
} else {
101+
return Promise.resolve(v);
102+
}
103+
})
105104
),
106105
_.omit(opt, customOptions)
107106
);
108107
}
109108

110109
load(key) {
111110
return key
112-
? Q(this.loader.load(key))
113-
: Q.reject(new TypeError('key parameter is required'));
111+
? Promise.resolve(this.loader.load(key))
112+
: Promise.reject(new TypeError('key parameter is required'));
114113
}
115114

116115
loadMany(keys) {
117116
return keys
118-
? Q(this.loader.loadMany(keys))
119-
: Q.reject(new TypeError('keys parameter is required'));
117+
? Promise.resolve(this.loader.loadMany(keys))
118+
: Promise.reject(new TypeError('keys parameter is required'));
120119
}
121120

122121
prime(key, val) {
123122
if (!key) {
124-
return Q.reject(new TypeError('key parameter is required'));
123+
return Promise.reject(new TypeError('key parameter is required'));
125124
} else if (val === undefined) {
126-
return Q.reject(new TypeError('value parameter is required'));
125+
return Promise.reject(new TypeError('value parameter is required'));
127126
} else {
128127
return rSetAndGet(this.keySpace, key, val, this.opt).then(r => {
129128
this.loader.clear(key).prime(key, r === '' ? null : r);
@@ -134,15 +133,15 @@ module.exports = fig => {
134133
clear(key) {
135134
return key
136135
? rDel(this.keySpace, key).then(() => this.loader.clear(key))
137-
: Q.reject(new TypeError('key parameter is required'));
136+
: Promise.reject(new TypeError('key parameter is required'));
138137
}
139138

140139
clearAllLocal() {
141-
return Q(this.loader.clearAll());
140+
return Promise.resolve(this.loader.clearAll());
142141
}
143142

144143
clearLocal(key) {
145-
return Q(this.loader.clear(key));
144+
return Promise.resolve(this.loader.clear(key));
146145
}
147146
};
148147
};

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
"dependencies": {
2727
"bluebird": "^3.5.0",
2828
"dataloader": "^1.2.0",
29-
"lodash": "^4.17.2",
30-
"q": "^1.4.1"
29+
"lodash": "^4.17.2"
3130
},
3231
"devDependencies": {
3332
"chai": "^3.5.0",
33+
"chai-as-promised": "^7.1.1",
3434
"gulp": "^3.9.1",
3535
"gulp-mocha": "^3.0.1",
3636
"redis": "^2.6.3",

0 commit comments

Comments
 (0)