JSPM

  • Created
  • Published
  • Downloads 69
  • Score
    100M100P100Q77483F
  • License MIT

aa - Async-Await. co like library, go like channel, thunkify or promisefy wrap package

Package Exports

  • aa

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (aa) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

aa - async await

aa - Async-Await library.
co like library, go like channel, thunkify or promisefy wrap package.

using ES6 (ES2015) generator function.

compatible with co@3 and co@4.

INSTALL:

$ npm install aa

NPM NPM

PREPARE:

  var aa = require('aa');

USAGE:

Quick sample code: aa-readme-example.js

$ iojs aa-readme-example.js
  var aa = require('aa');


  // sleep(ms, args,... cb) : node style normal callback
  function sleep(ms) {
    var args = [].slice.call(arguments, 1);
    setTimeout.apply(null, [args.pop(), ms, null].concat(args));
  }

  sleep(1000, function (err, val) { console.log('1000 ms OK'); });


  // delay(ms, args,...)(cb) : thunk
  function delay(ms) {
    var args = [].slice.call(arguments);
    return function (cb) {
      sleep.apply(null, args.concat(cb));
    };
  }

  delay(1100)(
    function (err, val) { console.log('1100 ms OK'); }
  );


  // aa(fn) | aa.wrap(fn) : returns wrapped function a.k.a thunkify and promisefy
  // wait(ms, args,...)   : returns promise & thunk
  var wait = aa(sleep);

  // wait() : as a thunk
  wait(1200)(
    function (err, val) { console.log('1200 ms OK'); }
  );

  // wait() : as a promise
  wait(1300).then(
    function (val) { console.log('1300 ms OK'); },
    function (err) { console.log('1300 ms NG', err); }
  ).catch(
    function (err) { console.log('1300 ms NG2', err); }
  );


  // aa(generator) : returns promise & thunk
  aa(function *() {

    yield 1;                    // primitive value
    yield [1, 2, 3];            // array
    yield {x:1, y:2, z:3};      // object


    // wait for promise
    yield Promise.resolve(2);


    // wait for thunk
    yield delay(800);


    // wait for promise or thunk
    yield wait(800);


    console.log('0:', yield wait(300, 0));
    console.log('1:', yield wait(300, 1));


    // yield Promise.all([])
    console.log('[1, 2, 3]:',
      yield Promise.all([wait(200, 1), wait(300, 2), wait(100, 3)]));


    // yield [] -> like Promise.all([]) !
    console.log('[4, 5, 6]:',
      yield [wait(200, 4), wait(300, 5), wait(100, 6)]);


    // yield {} -> like Promise.all({}) !?
    console.log('{x:7, y:8, z:9}:',
      yield {x:wait(200, 7), y:wait(300, 8), z:wait(100, 9)});


    // make channel for sync - fork and join
    var chan = aa(); // or aa.chan()

    sleep(300, 20, chan);   // send value to channel
    sleep(200, 10, chan);   // send value to channel
    var a = yield chan;     // recv value from channel
    var b = yield chan;     // recv value from channel
    console.log('10 20:', a, b);


    // fork thread -  make new thread and start
    aa(function *() {
      yield wait(200);      // wait 200 ms
      return 200;
    })(chan);               // send 200 to channel

    // fork thread -  make new thread and start
    aa(function *() {
      yield wait(100);      // wait 100 ms
      return 100;
    })(chan);               // send 100 to channel

    // fork thread -  make new thread and start
    aa(function *() {
      yield wait(300);      // wait 300
      return 300;
    })(chan);               // send 300 to channel

    // join threads - sync threads
    var x = yield chan;     // wait & recv first  value from channel
    var y = yield chan;     // wait & recv second value from channel
    var z = yield chan;     // wait & recv third  value from channel
    console.log('top 3 winners: 100 200 300:', x, y, z);


    // communicate with channels
    var chan1 = aa(), chan2 = aa();

    // thread 1: send to chan1, recv from chan2
    aa(function *() {
      sleep(100, 111, chan1);
      console.log('222:', yield chan2);
      sleep(100, 333, chan1);
      console.log('444:', yield chan2);
      sleep(100, 555, chan1);
      return 666;
    })(chan);

    // thread 1: recv from chan1, send to chan2
    aa(function *() {
      console.log('111:', yield chan1);
      sleep(100, 222, chan2);
      console.log('333:', yield chan1);
      sleep(100, 444, chan2);
      console.log('555:', yield chan1);
      return 777;
    })(chan);
    console.log('666 777:', yield chan, yield chan);

    return 11;
  })
  .then(
    function (val) {
      console.log('11 val:', val);
      return wait(100, 22); },
    function (err) {
      console.log('11 err:', err);
      return wait(100, 22); }
  )
  (function (err, val) {
      console.log('22 val:', val, err ? 'err:' + err : '');
      return wait(100, 33); })
  (function (err, val) {
      console.log('33 val:', val, err ? 'err:' + err : '');
      return wait(100, 44); })
  .then(
    function (val) {
      console.log('44 val:', val);
      return wait(100, 55); },
    function (err) {
      console.log('44 err:', err);
      return wait(100, 55); }
  )
  .catch(
    function (err) {
      console.log('55 err:', err);
      return wait(100, 66); }
  );

LICENSE:

MIT