From 0c8cadf38be75f4e14f068a13f4eccb2e6b8a5a6 Mon Sep 17 00:00:00 2001 From: Radek Stepan Date: Sat, 16 Jan 2016 16:15:27 +0100 Subject: [PATCH] callback with store value --- README.md | 5 ++ src/js/core/EventEmitter.js | 1 + src/js/core/Store.js | 18 +++++-- src/js/stores/projectsStore.js | 86 +++++++++++++++++----------------- 4 files changed, 62 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 2db724a..8abc25b 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,8 @@ $ make watch $ npm start # Server started on port 8080 ``` + +##CHANGELOG + +3.0.0 +- switch to React & Flux architecture diff --git a/src/js/core/EventEmitter.js b/src/js/core/EventEmitter.js index 744156e..8f4ee49 100644 --- a/src/js/core/EventEmitter.js +++ b/src/js/core/EventEmitter.js @@ -1,5 +1,6 @@ import _ from 'lodash'; +// TODO: add `onOnce` fn. export default class EventEmitter { constructor() { diff --git a/src/js/core/Store.js b/src/js/core/Store.js index 5a2edc0..53fbe8e 100644 --- a/src/js/core/Store.js +++ b/src/js/core/Store.js @@ -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); + }); } } diff --git a/src/js/stores/projectsStore.js b/src/js/stores/projectsStore.js index d50e32c..e92a550 100644 --- a/src/js/stores/projectsStore.js +++ b/src/js/stores/projectsStore.js @@ -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); }); }