// bsync (-fibers)
bsync
makes using fibers and futures unbelievably easy. the syntax
is dope and simple, particularly so if you're using CoffeeScript.
for the sake of convenience, bsync
also wraps a variety of functions
from caolan/async, making the syntax
more usable from CoffeeScript (those double callback invocations were
always sort of a mess in Coffee).
bsync
relies upon laverdet/node-fibers
for its under-the-hood magic.
installing
$ npm install bsync-fibers
examples
caolan/async wrappers
using one of bsync
's wrappers for the functions in caolan/async
,
we end up with syntax that looks almost identical to the core javascript
collection methods (like, say, Array.map
), but with the huge bonus
that it's still asynchronous!
bsync = require 'bsync-fibers' bsync fffiber -> try data = 123450 mapped = bsyncmap data cbnullitem * 10 consolelog "Finished with bsync.map:"mapped catch err consoleerror "Error mapping random data to random other data:"err
any asynchronous function taking a callback with one return value
one of node's core fs
functions:
fs = require 'fs' require 'bsync-fibers' fffiber -> try exists = wwwait fsexists some_fileresolve consolelog "The file "exists ? 'exists' : 'does not exist' catch err consoleerror "Error in fs.exists:"err
using wwwait
to grab image data using the imagemagick
module:
imagemagick = require 'imagemagick' require 'bsync-fibers' fffiber -> try wwwait imagemagickidentify my_image_pathresolve consolelog "The image dimensions are x" catch err consoleerror "Error in imagemagick module:"err
any asynchronous function taking a callback with multiple return values
wwwait
can also take an array of argument names as its first parameter.
this will cause it to spit out an object with callback values mapped to
those names. coupled with CoffeeScript's destructuring assignment syntax,
this makes for some EXTREMELY readable code.
mikeal's request
module has a function request()
that takes a callback
with the signature callback(err, status, body)
. to capture status
AND
body
, we can do the following:
request = require 'request' require 'bsync-fibers' fffiber -> try wwwait 'status''body' request 'http://google.com'resolve consolelog "The request returned status . Body: " catch err consoleerror "Request spat out an error:"err
waiting on multiple fffutures at the same time
notice the difference between wwwait
and wait
(wait
is simply the same
wait()
method as you'll find in the fibers/futures
module).
request = require 'request' require 'bsync-fibers' fffiber -> try img1 = fffuture 'status''image_data' request 'http://blah/image1.png'resolve img2 = fffuture 'status''image_data' request 'http://blah/image2.png'resolve img3 = fffuture 'status''image_data' request 'http://blah/image3.png'resolve wait img1img2img3 images = imagespush img1get imagespush img2get imagespush img3get if images0status is 200 consolelog "image1.png downloaded successfully" fswriteFile './image1.png'images0image_data # etc ... catch err # ...
or for maximum compactness (same example as above):
request = require 'request' require 'bsync-fibers' fffiber -> try wait = fffuture 'status''image_data' request "http://blah/image.png"resolve for i in 1...3 images = futureget for future in futures for imagei in images when imagestatus is 200 consolelog "image.png downloaded successfully" fswriteFile "./image.png"imageimage_data # etc ... catch err # ...
kinda unbelievable, eh? love that coffeescript...
authors/contributors
bryn austin bellomy < bryn.bellomy@gmail.com >
license (wtfpl v2)
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
- You just DO WHAT THE FUCK YOU WANT TO.