Giter VIP home page Giter VIP logo

Comments (6)

colegleason avatar colegleason commented on May 18, 2024

So it actually seems like the .gate() step is completing all of it's steps successfully. However, it isn't bundling the messages from the completion triggers together into an array like the example in the README suggests. The arguments object looks like this:

{ '0': { [Function: a] fail: [Function], abort: [Function] },
  '1': 
   { /* config object */ },
  '2': 
   { /* config object */ },
  '3': 
   { /* config object */ }
}

from asynquence.

getify avatar getify commented on May 18, 2024

Your functionality is mostly correct, but just a slight misunderstanding of how the arguments will arrive after a gate. The message(s) from each gate-segment will respectively take up one positional argument to the next sequence step's callback. If a gate-segment sends one message, then it will just be one argument. If a gate-segment sends 2 or more messages, then in that positional argument, there will be an array of the messages that gate-segment sent. Example:

ASQ()
.gate(
   function(done) {    done("1","2");  },
   function(done) {    done("3");  },
   function(done) {    done("4","5"); }
})
.val(function(){ // <-- Notice: `val` instead of `then`
   var messages = Array.prototype.slice.call(arguments);
   console.log(JSON.stringify(messages);   // [  ["1","2"], "3", ["4","5"]  ]
});

A few notes:

  1. I used val() instead of then() because I don't need the done parameter, and everything in that step will execute synchronously (just outputting). If I had used then(), the behavior would have been the same except the done callback would have been on the beginning of the arguments array. We'd have wanted to ditch it by calling messages.shift(), for example. I saved that mess by using val() which skips the done callback and only passes in messages.

    If, at the end of the val() call, you want to pass on another message to the next step in the chain, you can just return that message, and it will implicitly be passed along. You can only pass along one message this way.

  2. A positional argument is only an array if that corresponding gate-segment sent more than one message. Otherwise, the message itself would be in that positional argument.

  3. If a gate-segment sends no message, undefined will be in that corresponding positional argument.

from asynquence.

colegleason avatar colegleason commented on May 18, 2024

Ah I see. I should have noticed that. Thanks for the writeup.

from asynquence.

getify avatar getify commented on May 18, 2024

BTW, here's some suggested "improvements" to the organization to take advantage of some of asynquence API functionality.

function getEndpointConfig(endpoint) {
    return ASQ()
        .then(function(done){
            endpoint.getConfig(function(err,config){
                if (err) {
                    done.fail(err);
                }
                else {
                    config.id = endpoint.id;
                    console.log(config.id); 
                    done(config);
                }
            });
        })
    ;
}

// ASQ-chain
.seq(function(endpoints) {   // for this example, endpoints is an array of two object.
    var calls = [];
    endpoints.forEach(function(endpoint) {
        calls
        .push(function(done) {
            getEndpointConfig(endpoint).pipe(done); // <-- Notice: `pipe`
        });
    });
    return ASQ()
        .gate.apply(this,calls)
    ;
})
.val(function() { // <-- Notice: `val` instead of `then`
    var configs = Array.prototype.slice.call(arguments);
    console.log(configs);
    var configMap = _.pluck(configs, 'id');
    console.log(configMap);
})
.or(function(err){
    console.log(err);
});

Some notes:

  1. I use done.fail(...) to signal an error into the chain, and then at the bottom of the chain, I "catch" any of those with the or(..) handler.
  2. I use val() here again, same reasons as given before
  3. I pushed the implementation of the config-fetching into its own getEndpointConfig() function, and then had it return a sequence, then I used pipe(done) to wire up both the message and error channels from that sequence back into the main sequence.

from asynquence.

getify avatar getify commented on May 18, 2024

Also, I just updated the README to try to clarify the way gate messages (in and out) work... can you see if this helps makes it clearer?

881424b

from asynquence.

colegleason avatar colegleason commented on May 18, 2024

Looks good! Thanks for the clarification. I took your advice on that refactor as well, much cleaner.

from asynquence.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.