Skip to content

Instantly share code, notes, and snippets.

@neborn
Last active January 7, 2021 20:06
Show Gist options
  • Save neborn/5ad91f8a288ba77853c1c53fbb11042a to your computer and use it in GitHub Desktop.
Save neborn/5ad91f8a288ba77853c1c53fbb11042a to your computer and use it in GitHub Desktop.
Async Get Example
import Controller from '@ember/controller';
import { task, timeout } from 'ember-concurrency';
import { cached } from 'tracked-toolbox';
import { tracked } from '@glimmer/tracking';
export default class ApplicationController extends Controller {
@tracked haveFetchSucceed = true;
@cached
get appName() {
this.fetchAppName.perform(this.haveFetchSucceed);
return this.fetchAppName.last;
}
// I would have used a decorator from ember-concurrency-decorators, but that addon isn't working with Ember Twiddle.
@(task(function * (haveFetchSucceed) {
yield timeout(1000);
if (!haveFetchSucceed) {
throw new Error('Can\'t fetch app name')
}
return 'Async Get Example';
}).drop())
fetchAppName;
}
<h1>
{{#if this.appName.isRunning}}
Loading
{{else if this.appName.isError}}
Could not fetch app name
{{else}}
Welcome to {{this.appName.value}}
{{/if}}
</h1>
<div>
<button type="button" {{on "click" (fn (mut this.haveFetchSucceed) false)}}>
Trigger error
</button>
<button type="button" {{on "click" (fn (mut this.haveFetchSucceed) true)}}>
Trigger success
</button>
</div>
{
"version": "0.17.1",
"EmberENV": {
"FEATURES": {},
"_TEMPLATE_ONLY_GLIMMER_COMPONENTS": false,
"_APPLICATION_TEMPLATE_WRAPPER": true,
"_JQUERY_INTEGRATION": true
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.js",
"ember": "3.18.1",
"ember-template-compiler": "3.18.1",
"ember-testing": "3.18.1"
},
"addons": {
"@glimmer/component": "1.0.0",
"tracked-toolbox": "1.2.1",
"ember-concurrency": "1.3.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment