[Pkg-javascript-commits] [node-q] 03/06: Imported Upstream version 1.3.0
Sebastiaan Couwenberg
sebastic at moszumanska.debian.org
Mon Apr 27 09:43:01 UTC 2015
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository node-q.
commit 43a8cd049ce5dc9ea70044eeacb7ed00c5018d2c
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Mon Apr 27 11:29:55 2015 +0200
Imported Upstream version 1.3.0
---
CHANGES.md | 4 +++
package.json | 2 +-
q.js | 111 +++++++++++++++++++++++++++++++++++++++--------------------
3 files changed, 79 insertions(+), 38 deletions(-)
diff --git a/CHANGES.md b/CHANGES.md
index b828b24..1fa4a01 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,9 @@
<!-- vim:ts=4:sts=4:sw=4:et:tw=70 -->
+## 1.3.0
+
+ - Add tracking for unhandled and handled rejections in Node.js (@benjamingr).
+
## 1.2.1
- Fix Node.js environment detection for modern Browserify (@kahnjw).
diff --git a/package.json b/package.json
index 288f561..a5a8201 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "q",
- "version": "1.2.1",
+ "version": "1.3.0",
"description": "A library for promises (CommonJS/Promises/A,B,D)",
"homepage": "https://github.com/kriskowal/q",
"author": "Kris Kowal <kris at cixar.com> (https://github.com/kriskowal)",
diff --git a/q.js b/q.js
index 8f601ce..f80156a 100644
--- a/q.js
+++ b/q.js
@@ -91,57 +91,67 @@ var nextTick =(function () {
var flushing = false;
var requestTick = void 0;
var isNodeJS = false;
+ // queue for late tasks, used by unhandled rejection tracking
+ var laterQueue = [];
function flush() {
/* jshint loopfunc: true */
+ var task, domain;
while (head.next) {
head = head.next;
- var task = head.task;
+ task = head.task;
head.task = void 0;
- var domain = head.domain;
+ domain = head.domain;
if (domain) {
head.domain = void 0;
domain.enter();
}
+ runSingle(task, domain);
- try {
- task();
-
- } catch (e) {
- if (isNodeJS) {
- // In node, uncaught exceptions are considered fatal errors.
- // Re-throw them synchronously to interrupt flushing!
-
- // Ensure continuation if the uncaught exception is suppressed
- // listening "uncaughtException" events (as domains does).
- // Continue in next event to avoid tick recursion.
- if (domain) {
- domain.exit();
- }
- setTimeout(flush, 0);
- if (domain) {
- domain.enter();
- }
-
- throw e;
+ }
+ while (laterQueue.length) {
+ task = laterQueue.pop();
+ runSingle(task);
+ }
+ flushing = false;
+ }
+ // runs a single function in the async queue
+ function runSingle(task, domain) {
+ try {
+ task();
- } else {
- // In browsers, uncaught exceptions are not fatal.
- // Re-throw them asynchronously to avoid slow-downs.
- setTimeout(function() {
- throw e;
- }, 0);
+ } catch (e) {
+ if (isNodeJS) {
+ // In node, uncaught exceptions are considered fatal errors.
+ // Re-throw them synchronously to interrupt flushing!
+
+ // Ensure continuation if the uncaught exception is suppressed
+ // listening "uncaughtException" events (as domains does).
+ // Continue in next event to avoid tick recursion.
+ if (domain) {
+ domain.exit();
+ }
+ setTimeout(flush, 0);
+ if (domain) {
+ domain.enter();
}
- }
- if (domain) {
- domain.exit();
+ throw e;
+
+ } else {
+ // In browsers, uncaught exceptions are not fatal.
+ // Re-throw them asynchronously to avoid slow-downs.
+ setTimeout(function () {
+ throw e;
+ }, 0);
}
}
- flushing = false;
+ if (domain) {
+ domain.exit();
+ }
}
nextTick = function (task) {
@@ -210,7 +220,16 @@ var nextTick =(function () {
setTimeout(flush, 0);
};
}
-
+ // runs a task after all other tasks have been run
+ // this is useful for unhandled rejection tracking that needs to happen
+ // after all `then`d tasks have been run.
+ nextTick.runAfter = function (task) {
+ laterQueue.push(task);
+ if (!flushing) {
+ flushing = true;
+ requestTick();
+ }
+ };
return nextTick;
})();
@@ -704,9 +723,9 @@ Promise.prototype.join = function (that) {
*/
Q.race = race;
function race(answerPs) {
- return promise(function(resolve, reject) {
+ return promise(function (resolve, reject) {
// Switch to this once we can assume at least ES5
- // answerPs.forEach(function(answerP) {
+ // answerPs.forEach(function (answerP) {
// Q(answerP).then(resolve, reject);
// });
// Use this in the meantime
@@ -1004,6 +1023,7 @@ Promise.prototype.isRejected = function () {
// shimmed environments, this would naturally be a `Set`.
var unhandledReasons = [];
var unhandledRejections = [];
+var reportedUnhandledRejections = [];
var trackUnhandledRejections = true;
function resetUnhandledRejections() {
@@ -1019,6 +1039,14 @@ function trackRejection(promise, reason) {
if (!trackUnhandledRejections) {
return;
}
+ if (typeof process === "object" && typeof process.emit === "function") {
+ Q.nextTick.runAfter(function () {
+ if (array_indexOf(unhandledRejections, promise) !== -1) {
+ process.emit("unhandledRejection", reason, promise);
+ reportedUnhandledRejections.push(promise);
+ }
+ });
+ }
unhandledRejections.push(promise);
if (reason && typeof reason.stack !== "undefined") {
@@ -1035,6 +1063,15 @@ function untrackRejection(promise) {
var at = array_indexOf(unhandledRejections, promise);
if (at !== -1) {
+ if (typeof process === "object" && typeof process.emit === "function") {
+ Q.nextTick.runAfter(function () {
+ var atReport = array_indexOf(reportedUnhandledRejections, promise);
+ if (atReport !== -1) {
+ process.emit("rejectionHandled", unhandledReasons[at], promise);
+ reportedUnhandledRejections.splice(atReport, 1);
+ }
+ });
+ }
unhandledRejections.splice(at, 1);
unhandledReasons.splice(at, 1);
}
@@ -1562,7 +1599,7 @@ function any(promises) {
var deferred = Q.defer();
var pendingCount = 0;
- array_reduce(promises, function(prev, current, index) {
+ array_reduce(promises, function (prev, current, index) {
var promise = promises[index];
pendingCount++;
@@ -1591,7 +1628,7 @@ function any(promises) {
return deferred.promise;
}
-Promise.prototype.any = function() {
+Promise.prototype.any = function () {
return any(this);
};
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-q.git
More information about the Pkg-javascript-commits
mailing list