callback with store value

This commit is contained in:
Radek Stepan 2016-01-16 16:15:27 +01:00
parent c35859fd4e
commit 0c8cadf38b
4 changed files with 62 additions and 48 deletions

View File

@ -14,3 +14,8 @@ $ make watch
$ npm start
# Server started on port 8080
```
##CHANGELOG
3.0.0
- switch to React & Flux architecture

View File

@ -1,5 +1,6 @@
import _ from 'lodash';
// TODO: add `onOnce` fn.
export default class EventEmitter {
constructor() {

View File

@ -62,11 +62,19 @@ export default class Store extends EventEmitter {
}
}
// Get this key path or everything. Pass truthy value as a 2nd param to get
// a deep clone of the object (expensive).
get(path, clone=false) {
let fn = clone ? _.cloneDeep : _.identity;
return fn(opa.get(this[DATA], path));
// Get this key path or everything. Pass a callback to be
// provided with value once it is set.
get(path, cb) {
let val = opa.get(this[DATA], path);
if (!_.isFunction(cb)) return val;
if (opa.has(this[DATA], path)) return cb(val);
// TODO: unit-test.
this.on(path, (...args) => {
this.off(path, cb);
cb.apply(this, args);
});
}
}

View File

@ -42,7 +42,6 @@ class ProjectsStore extends Store {
// Listen to when user is ready and save info on us.
actions.on('user.ready', (user) => {
// TODO: this is not guaranteed to arrive before our projects load!
this.set('user', user);
});
@ -66,53 +65,54 @@ class ProjectsStore extends Store {
// Quit if we have no projects.
if (!list.length) return;
let user = this.get('user') || {};
// For all projects.
async.map(list, (project, cb) => {
// Fetch their milestones.
milestones.fetchAll(user, project, (err, list) => {
// Save the error if project does not exist.
if (err) {
this.saveError(project, err);
return cb();
}
// Now add in the issues.
async.each(list, (milestone, cb) => {
// Do we have this milestone already?
if (_.find(project.milestones, (arg) => {
var number;
number = arg.number;
return milestone.number === number;
})) {
return cb(null);
// Wait for the user to get resolved.
this.get('user', (user) => {
// For all projects.
async.map(list, (project, cb) => {
// Fetch their milestones.
milestones.fetchAll(user, project, (err, list) => {
// Save the error if project does not exist.
if (err) {
this.saveError(project, err);
return cb();
}
// OK fetch all the issues for this milestone then.
issues.fetchAll(user, {
'owner': project.owner,
'name': project.name,
'milestone': milestone.number
}, (err, obj) => {
// Save any errors on the project.
if (err) {
this.saveError(project, err);
return cb();
// Now add in the issues.
async.each(list, (milestone, cb) => {
// Do we have this milestone already?
if (_.find(project.milestones, (arg) => {
var number;
number = arg.number;
return milestone.number === number;
})) {
return cb(null);
}
// Add in the issues to the milestone.
_.extend(milestone, { 'issues': obj });
// Save the milestone.
this.addMilestone(project, milestone);
// Done.
cb();
});
}, cb);
// OK fetch all the issues for this milestone then.
issues.fetchAll(user, {
'owner': project.owner,
'name': project.name,
'milestone': milestone.number
}, (err, obj) => {
// Save any errors on the project.
if (err) {
this.saveError(project, err);
return cb();
}
// Add in the issues to the milestone.
_.extend(milestone, { 'issues': obj });
// Save the milestone.
this.addMilestone(project, milestone);
// Done.
cb();
});
}, cb);
});
// All done, any errors are ignored as saved on projects.
}, (err) => {
actions.emit('system.loading', false);
});
// All done, any errors are ignored as saved on projects.
}, (err) => {
actions.emit('system.loading', false);
});
}