Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 2a5c355

Browse files
caiotoonchirayuk
authored andcommitted
feat($q): added support to promise notification
It is now possible to notify a promise through deferred.notify() method. Notifications are useful to provide a way to send progress information to promise holders.
1 parent d884eb8 commit 2a5c355

File tree

2 files changed

+345
-20
lines changed

2 files changed

+345
-20
lines changed

src/ng/q.js

+42-6
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ function qFactory(nextTick, exceptionHandler) {
199199
var callback;
200200
for (var i = 0, ii = callbacks.length; i < ii; i++) {
201201
callback = callbacks[i];
202-
value.then(callback[0], callback[1]);
202+
value.then(callback[0], callback[1], callback[2]);
203203
}
204204
});
205205
}
@@ -212,8 +212,25 @@ function qFactory(nextTick, exceptionHandler) {
212212
},
213213

214214

215+
notify: function(progress) {
216+
if (pending) {
217+
var callbacks = pending;
218+
219+
if (pending.length) {
220+
nextTick(function() {
221+
var callback;
222+
for (var i = 0, ii = callbacks.length; i < ii; i++) {
223+
callback = callbacks[i];
224+
callback[2](progress);
225+
}
226+
});
227+
}
228+
}
229+
},
230+
231+
215232
promise: {
216-
then: function(callback, errback) {
233+
then: function(callback, errback, progressback) {
217234
var result = defer();
218235

219236
var wrappedCallback = function(value) {
@@ -234,10 +251,18 @@ function qFactory(nextTick, exceptionHandler) {
234251
}
235252
};
236253

254+
var wrappedProgressback = function(progress) {
255+
try {
256+
result.notify((progressback || defaultCallback)(progress));
257+
} catch(e) {
258+
exceptionHandler(e);
259+
}
260+
};
261+
237262
if (pending) {
238-
pending.push([wrappedCallback, wrappedErrback]);
263+
pending.push([wrappedCallback, wrappedErrback, wrappedProgressback]);
239264
} else {
240-
value.then(wrappedCallback, wrappedErrback);
265+
value.then(wrappedCallback, wrappedErrback, wrappedProgressback);
241266
}
242267

243268
return result.promise;
@@ -359,7 +384,7 @@ function qFactory(nextTick, exceptionHandler) {
359384
* @param {*} value Value or a promise
360385
* @returns {Promise} Returns a promise of the passed value or promise
361386
*/
362-
var when = function(value, callback, errback) {
387+
var when = function(value, callback, errback, progressback) {
363388
var result = defer(),
364389
done;
365390

@@ -381,15 +406,26 @@ function qFactory(nextTick, exceptionHandler) {
381406
}
382407
};
383408

409+
var wrappedProgressback = function(progress) {
410+
try {
411+
return (progressback || defaultCallback)(progress);
412+
} catch (e) {
413+
exceptionHandler(e);
414+
}
415+
};
416+
384417
nextTick(function() {
385418
ref(value).then(function(value) {
386419
if (done) return;
387420
done = true;
388-
result.resolve(ref(value).then(wrappedCallback, wrappedErrback));
421+
result.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback));
389422
}, function(reason) {
390423
if (done) return;
391424
done = true;
392425
result.resolve(wrappedErrback(reason));
426+
}, function(progress) {
427+
if (done) return;
428+
result.notify(wrappedProgressback(progress));
393429
});
394430
});
395431

0 commit comments

Comments
 (0)