Propagate promise rejections so we show the fallback.

-Adds rejection support to Promise.All.
-Makes promise.then() callback optional.
This commit is contained in:
Brendan Dahl 2013-05-08 11:55:29 -07:00
parent bf2ebd3714
commit 3dadde52dc
3 changed files with 31 additions and 14 deletions

View File

@ -156,6 +156,10 @@ var Page = (function PageClosure() {
var self = this; var self = this;
var promise = new Promise(); var promise = new Promise();
function reject(e) {
promise.reject(e);
}
var pageListPromise = new Promise(); var pageListPromise = new Promise();
var annotationListPromise = new Promise(); var annotationListPromise = new Promise();
@ -170,7 +174,7 @@ var Page = (function PageClosure() {
this.idCounters); this.idCounters);
var dataPromises = Promise.all( var dataPromises = Promise.all(
[contentStreamPromise, resourcesPromise]); [contentStreamPromise, resourcesPromise], reject);
dataPromises.then(function(data) { dataPromises.then(function(data) {
var contentStream = data[0]; var contentStream = data[0];
var resources = data[1]; var resources = data[1];
@ -181,7 +185,8 @@ var Page = (function PageClosure() {
opListPromise.then(function(data) { opListPromise.then(function(data) {
pageListPromise.resolve(data); pageListPromise.resolve(data);
}); });
} },
reject
); );
}); });
@ -195,7 +200,8 @@ var Page = (function PageClosure() {
}); });
} }
); );
} },
reject
); );
Promise.all([pageListPromise, annotationListPromise]).then( Promise.all([pageListPromise, annotationListPromise]).then(
@ -211,7 +217,8 @@ var Page = (function PageClosure() {
Util.extendObj(pageData.dependencies, annotationData.dependencies); Util.extendObj(pageData.dependencies, annotationData.dependencies);
promise.resolve(pageData); promise.resolve(pageData);
} },
reject
); );
return promise; return promise;

View File

@ -672,16 +672,26 @@ var Promise = PDFJS.Promise = (function PromiseClosure() {
deferred.resolve(results); deferred.resolve(results);
return deferred; return deferred;
} }
function reject(reason) {
if (deferred.isRejected) {
return;
}
results = [];
deferred.reject(reason);
}
for (var i = 0, ii = promises.length; i < ii; ++i) { for (var i = 0, ii = promises.length; i < ii; ++i) {
var promise = promises[i]; var promise = promises[i];
promise.then((function(i) { promise.then((function(i) {
return function(value) { return function(value) {
if (deferred.isRejected) {
return;
}
results[i] = value; results[i] = value;
unresolved--; unresolved--;
if (unresolved === 0) if (unresolved === 0)
deferred.resolve(results); deferred.resolve(results);
}; };
})(i)); })(i), reject);
} }
return deferred; return deferred;
}; };
@ -762,12 +772,8 @@ var Promise = PDFJS.Promise = (function PromiseClosure() {
}, },
then: function Promise_then(callback, errback, progressback) { 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 the promise is already resolved, call the callback directly.
if (this.isResolved) { if (this.isResolved && callback) {
var data = this.data; var data = this.data;
callback.call(null, data); callback.call(null, data);
} else if (this.isRejected && errback) { } else if (this.isRejected && errback) {
@ -775,10 +781,13 @@ var Promise = PDFJS.Promise = (function PromiseClosure() {
var exception = this.exception; var exception = this.exception;
errback.call(null, error, exception); errback.call(null, error, exception);
} else { } else {
if (callback) {
this.callbacks.push(callback); this.callbacks.push(callback);
if (errback) }
if (errback) {
this.errbacks.push(errback); this.errbacks.push(errback);
} }
}
if (progressback) if (progressback)
this.progressbacks.push(progressback); this.progressbacks.push(progressback);

View File

@ -137,7 +137,8 @@ var WorkerMessageHandler = {
javaScript: results[6] javaScript: results[6]
}; };
loadDocumentPromise.resolve(doc); loadDocumentPromise.resolve(doc);
}); },
parseFailure);
}; };
var parseFailure = function parseFailure(e) { var parseFailure = function parseFailure(e) {
@ -261,7 +262,7 @@ var WorkerMessageHandler = {
var onSuccess = function(doc) { var onSuccess = function(doc) {
handler.send('GetDoc', { pdfInfo: doc }); handler.send('GetDoc', { pdfInfo: doc });
pdfManager.ensureModel('traversePages', []); pdfManager.ensureModel('traversePages', []).then(null, onFailure);
}; };
var onFailure = function(e) { var onFailure = function(e) {