From 3dadde52dc20b1aad57de3dad49d7e08130d6c2a Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Wed, 8 May 2013 11:55:29 -0700 Subject: [PATCH] Propagate promise rejections so we show the fallback. -Adds rejection support to Promise.All. -Makes promise.then() callback optional. --- src/core.js | 15 +++++++++++---- src/util.js | 25 +++++++++++++++++-------- src/worker.js | 5 +++-- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/core.js b/src/core.js index e6391610c..553d9c517 100644 --- a/src/core.js +++ b/src/core.js @@ -156,6 +156,10 @@ var Page = (function PageClosure() { var self = this; var promise = new Promise(); + function reject(e) { + promise.reject(e); + } + var pageListPromise = new Promise(); var annotationListPromise = new Promise(); @@ -170,7 +174,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]; @@ -181,7 +185,8 @@ var Page = (function PageClosure() { opListPromise.then(function(data) { pageListPromise.resolve(data); }); - } + }, + reject ); }); @@ -195,7 +200,8 @@ var Page = (function PageClosure() { }); } ); - } + }, + reject ); Promise.all([pageListPromise, annotationListPromise]).then( @@ -211,7 +217,8 @@ var Page = (function PageClosure() { Util.extendObj(pageData.dependencies, annotationData.dependencies); promise.resolve(pageData); - } + }, + reject ); return promise; diff --git a/src/util.js b/src/util.js index 4094c3350..82d040e0c 100644 --- a/src/util.js +++ b/src/util.js @@ -672,16 +672,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; }; @@ -762,12 +772,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) { @@ -775,9 +781,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 a77387385..416bd52ec 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) {