diff --git a/app/controllers/crate/version.js b/app/controllers/crate/version.js index 993abe1e774..413793e0f78 100644 --- a/app/controllers/crate/version.js +++ b/app/controllers/crate/version.js @@ -127,27 +127,24 @@ export default Controller.extend({ return data; }), + readme: alias('loadReadmeTask.last.value'), + loadReadmeTask: task(function* () { - if (this.currentVersion.get('readme_path')) { - try { - let r = yield fetch(this.currentVersion.get('readme_path')); - if (r.ok) { - this.crate.set('readme', yield r.text()); - - if (typeof document !== 'undefined') { - setTimeout(() => { - let e = document.createEvent('CustomEvent'); - e.initCustomEvent('hashchange', true, true); - window.dispatchEvent(e); - }); - } - } else { - this.crate.set('readme', null); - } - } catch (error) { - this.crate.set('readme', null); - } + let version = this.currentVersion; + + let readme = version.loadReadmeTask.lastSuccessful + ? version.loadReadmeTask.lastSuccessful.value + : yield version.loadReadmeTask.perform(); + + if (typeof document !== 'undefined') { + setTimeout(() => { + let e = document.createEvent('CustomEvent'); + e.initCustomEvent('hashchange', true, true); + window.dispatchEvent(e); + }); } + + return readme; }), documentationLink: computed( diff --git a/app/models/version.js b/app/models/version.js index 27a9368ed19..b02c517b376 100644 --- a/app/models/version.js +++ b/app/models/version.js @@ -39,4 +39,15 @@ export default Model.extend({ return { normal, build, dev }; }).keepLatest(), + + loadReadmeTask: task(function* () { + if (this.readme_path) { + let response = yield fetch(this.readme_path); + if (!response.ok) { + throw new Error(`README request for ${this.crateName} v${this.num} failed`); + } + + return yield response.text(); + } + }).keepLatest(), }); diff --git a/app/routes/crate/version.js b/app/routes/crate/version.js index 8bdd4061ccb..d6766335720 100644 --- a/app/routes/crate/version.js +++ b/app/routes/crate/version.js @@ -62,7 +62,9 @@ export default Route.extend({ this._super(...arguments); model.version.loadDepsTask.perform(); - controller.loadReadmeTask.perform(); + controller.loadReadmeTask.perform().catch(() => { + // ignored + }); let { crate } = model; if (!crate.documentation || crate.documentation.startsWith('https://docs.rs/')) { diff --git a/app/templates/crate/version.hbs b/app/templates/crate/version.hbs index 59937ee1eee..90c6e831bd9 100644 --- a/app/templates/crate/version.hbs +++ b/app/templates/crate/version.hbs @@ -56,9 +56,9 @@ {{/if}} - {{#if this.crate.readme}} + {{#if this.readme}}
- {{html-safe this.crate.readme}} + {{html-safe this.readme}}
{{else}} {{#if this.crate.description}}