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}}