Hello, this seems like a fairly well addressed use case. You're not so far !

First of all, I strongly suggest you stick to the convention of error first 
callbacks. Believe me it will help you use other tools and interoperate 
them with your code.
The principle is simple : whenever a method/function is asynchronous

   - it takes a callback as last argument
   - when an error occurs during that operation, it calls the callback with 
   an error as first argument
   - when successful, it calls the callback with null as first argument and 
   the result as second argument

If you can change your methods to follow this pattern, then you'll be able 
to use the async [1] module directly to handle your aggregation of several 
asynchronous results.
If you want to trigger events only if the state of the lamps have changed, 
you could use something like deep-equal [2] to compare results over time.

In the end, you should be able to write something like this

var deepEqual = require('deep-equal');var async = require('async');
function initLightState (ids, callback) {
  var lastKnownStates = {}; // initialise to empty array
  var tasks = ids.reduce(function (tasks, id) {
    tasks[id] = getLightState.bind(id);
    // If you want to use less magic
    // the following is strictly equivalent
    tasks[id] = function (callback) {
      getLightState(id, callback);
    }
    return tasks;
  } {});

  // checking states every 500 ms
  return setInterval(checkState, 500);

  function checkState () {
    async.parallel(tasks, function (err, states) {
      if(!deepEqual(states, lastKnownStates)) {
        notifyClient(states);
      }
    });
  };}


[1] https://www.npmjs.org/package/async
[2] https://www.npmjs.org/package/deep-equal

On Thursday, 3 April 2014 20:13:38 UTC+2, JL wrote:
>
> Hello everyone,
>
> I am learning javascript and nodejs, im currently making an nodejs app to 
> manage my philips hue lamps.
>
> And i am struggling with the asynchronous and callbacks.
>
> First let me explain what i want to achieve.
>
> I have a function that get the id of all my lights, named getLightsId :
>
> function getLightsId(callback){
>     args ={
>         path:{"username":"username"}
>     };
>
>     client.registerMethod("getLightState", 
> "bridge_adress/api/${username}/lights/", "GET");
>
>     client.methods.getLightState(args, function(data,response){
>         var id = [];
>         for(key in data){
>             id.push(key);
>         }
>         callback(id);
>     });}
>
> Then i have a function getLightState that get the state of a specific lamp 
> determined by its id
>
> function getLightState(id, callback){
>
>     args ={
>         path:{"username":"username", "id":id}
>     };
>
>     client.registerMethod("getLightState", 
> "http://bridge_address/api/${username}/lights/${id}";, "GET");
>
>     client.methods.getLightState(args, function(data,response){
>         callback(data);
>     });}
>
> And finally i have a function initLightsState that send the state of all 
> the lights in an object to my client. be prepared to see ugly shit :p, its 
> pretty dirty, but hey, it works (kinda).
>
> function initLightsState(callback){
>
>     getLightsId(function(idArray) {
>
>         var lightsState = new Object();
>
>         idArray.forEach(function(id) {
>
>             setInterval(function(){getLightState(id, function(state) {
>
>                 lightsState[id] = state;
>             });},500);
>         });
>
>         callback(lightsState);
>         io.sockets.on('connection', function (socket) {
>             setInterval(function(){
>                 socket.emit('updateLightsState', lightsState);
>             },500);
>         });
>     });}
>
> I had to put a setInterval() to my getLightState function because 
> otherwise it was always sending me the same object with the same data, i 
> know its dirty but i couldnt find another way.
>
> then i emit also with a setInterval() my object to my client.
>
> The problem is that its obviously spamming my client with the state of my 
> lights.. it works, but its very far from being the cleanest way to do this.
>
> What i want to do, is to compare server-side the previous state of my 
> light with the current one, and only if its different send it to the client.
>
> But im stuck with the callback and everything and cant get it work.
>
> Could someone please show me the simplest way to do this ?
>
> Thanks a lot.
>

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to