Skip to content

Instantly share code, notes, and snippets.

@jelhan
Created July 14, 2018 18:11
Show Gist options
  • Save jelhan/cd50602d2fe6c04531c1783e04713736 to your computer and use it in GitHub Desktop.
Save jelhan/cd50602d2fe6c04531c1783e04713736 to your computer and use it in GitHub Desktop.
defer requests
import Controller from '@ember/controller';
import { A } from '@ember/array';
import { computed } from '@ember/object';
import { later } from '@ember/runloop';
import { Promise } from 'rsvp';
export default Ember.Controller.extend({
appName: 'Ember Twiddle',
deferredRequests: computed(() => A()),
requestCount: 0,
actions: {
start() {
let deferredRequest = {
handler: null,
id: this.get('requestCount'),
mayResolve: false,
resolve: () => {}
};
deferredRequest.handler = new Promise((resolve) => {
deferredRequest.resolve = resolve;
later(() => {
if (deferredRequest.mayResolve) {
this.get('deferredRequests').removeObject(deferredRequest);
resolve('after 2ms');
} else {
deferredRequest.mayResolve = true;
}
}, 2000);
}).then((type) => {
console.log(`request ${deferredRequest.id} resolved: ${type}`);
});
this.get('deferredRequests').pushObject(deferredRequest);
this.incrementProperty('requestCount');
},
resolve() {
console.log(`${this.get('deferredRequests')} requests deferred`);
let resolvedRequests = [];
this.get('deferredRequests').forEach((deferredRequest) => {
if (deferredRequest.mayResolve) {
console.log(`resolve ${deferredRequest.id} now`);
// must remove the items of array after looping has finished
// otherwise some item of the array are skipped
resolvedRequests.push(deferredRequest);
deferredRequest.resolve('after additional time');
} else {
console.log(`resolve ${deferredRequest.id} later`);
deferredRequest.mayResolve = true;
}
});
this.get('deferredRequests').removeObjects(resolvedRequests);
}
}
});
<h1>Welcome to {{appName}}</h1>
<br>
Pending requests: {{deferredRequests.length}}
<br>
<button onclick={{action 'start'}}>start</button>
<button onclick={{action 'resolve'}}>resolve</button>
<br>
<br>
{
"version": "0.15.0",
"EmberENV": {
"FEATURES": {}
},
"options": {
"use_pods": false,
"enable-testing": false
},
"dependencies": {
"jquery": "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js",
"ember": "3.2.2",
"ember-template-compiler": "3.2.2",
"ember-testing": "3.2.2"
},
"addons": {
"ember-data": "3.2.0"
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment