diff --git a/src/core.js b/src/core.js index 4c262b2d7..785654cdb 100644 --- a/src/core.js +++ b/src/core.js @@ -137,6 +137,10 @@ var Page = (function PageClosure() { var self = this; var promise = new Promise(); + function reject(e) { + promise.reject(e); + } + var pageListPromise = new Promise(); var pdfManager = this.pdfManager; @@ -150,7 +154,7 @@ var Page = (function PageClosure() { this.idCounters); var dataPromises = Promise.all( - [contentStreamPromise, resourcesPromise]); + [contentStreamPromise, resourcesPromise], reject); dataPromises.then(function(data) { var contentStream = data[0]; var resources = data[1]; @@ -161,7 +165,8 @@ var Page = (function PageClosure() { opListPromise.then(function(data) { pageListPromise.resolve(data); }); - } + }, + reject ); }); @@ -195,9 +200,9 @@ var Page = (function PageClosure() { PartialEvaluator.optimizeQueue(pageQueue); promise.resolve(pageData); - }); - }); - }); + }, reject); + }, reject); + }, reject); return promise; }, diff --git a/src/util.js b/src/util.js index 0ee9ef6ed..8955a5001 100644 --- a/src/util.js +++ b/src/util.js @@ -694,16 +694,26 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { deferred.resolve(results); return deferred; } + function reject(reason) { + if (deferred.isRejected) { + return; + } + results = []; + deferred.reject(reason); + } for (var i = 0, ii = promises.length; i < ii; ++i) { var promise = promises[i]; promise.then((function(i) { return function(value) { + if (deferred.isRejected) { + return; + } results[i] = value; unresolved--; if (unresolved === 0) deferred.resolve(results); }; - })(i)); + })(i), reject); } return deferred; }; @@ -784,12 +794,8 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { }, then: function Promise_then(callback, errback, progressback) { - if (!callback) { - error('Requiring callback' + this.name); - } - // If the promise is already resolved, call the callback directly. - if (this.isResolved) { + if (this.isResolved && callback) { var data = this.data; callback.call(null, data); } else if (this.isRejected && errback) { @@ -797,9 +803,12 @@ var Promise = PDFJS.Promise = (function PromiseClosure() { var exception = this.exception; errback.call(null, error, exception); } else { - this.callbacks.push(callback); - if (errback) + if (callback) { + this.callbacks.push(callback); + } + if (errback) { this.errbacks.push(errback); + } } if (progressback) diff --git a/src/worker.js b/src/worker.js index 5209c6015..8e556c85a 100644 --- a/src/worker.js +++ b/src/worker.js @@ -137,7 +137,8 @@ var WorkerMessageHandler = { javaScript: results[6] }; loadDocumentPromise.resolve(doc); - }); + }, + parseFailure); }; var parseFailure = function parseFailure(e) { @@ -261,7 +262,7 @@ var WorkerMessageHandler = { var onSuccess = function(doc) { handler.send('GetDoc', { pdfInfo: doc }); - pdfManager.ensureModel('traversePages', []); + pdfManager.ensureModel('traversePages', []).then(null, onFailure); }; var onFailure = function(e) {