Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including fibby with all npm packages installed. Try it out:

var fibby = require("fibby")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

fibby v0.1.2

Use fibers with functions that take callbacks.

fibby

A tiny library for node that helps you use fibers with node-style callbacks and works similarly to suspend

usage examples

Spawn a fiber task. From within your task, call your async functions with yield and pass them a resume function instead of a callback:

fibby.run(function (fib) {
    console.log("Hello");
    fib.yield(setInterval(fib.resume(), 1000))
    console.log("World");
});

Handle errors with try/catch, or as return results via resume.nothrow

fibby.run(function (fib) {
    // Throwing resume
    try { fib.yield(fs.readFile("test.js", fib.resume())); } 
    catch (e) { /* handle the error */ }
    // Non-throwing resume always results with an array
    var err_res = fib.yield(fs.readFile("test.js", fib.resume.nothrow()));
    if (err_res[0]) { /* handle error */ }
});

Dont like nested parens? Want to keep things brief? Use resume.t instead of resume() and resume.nt instead of resume.nothrow()

Want to catch all uncaught exceptions? You can pass a callback argument to fibby.run:

fibby.run(function (fib) {
    var data = fib.yield(fs.readFile("test.js", fib.resume.t));
}, function(err) {
    // thrown error propagates here automagically 
    // because it was not caught.
});

You can also use fibby instead to create a function which can accept multiple arguments and a callback. The arguments will be passed to your fiber right after the first resume argument

var getLine = fibby.fn(function (fib, file, number) {
    var data = fib.yield(fs.readFile(file, fib.resume.t));
    return data.toString().split('\n')[number];
});

getLine('test.js', 2, function(err, lineContent) {
    // thrown error propagates here automagically 
    // because it was not caught.
    // If the file actually exists, lineContent
    // will contain the second line
});

note: make sure that you pass the callback last.

Notice how if you return a value at the end of your fiber, it will be passed as a result to the callback. If you return undefined, the callback will not be called.

Your async functions call the callback with more than 2 arguments? Not a problem - the yield call from within your task will return an array instead.

function returnsmore(callback) {
    callback(null, 'arg1', 'arg2');
}

fibby.run(function (fib) {
    var res = fib.yield(returnsmore(fib.resume.t));
    var arg1 = res[0];
    var arg2 = res[1];
    var nothrowres = fib.yield(returnsmore(fib.resume.nt);
    var err = res[0];
    var arg1 = res[1];
    var arg2 = res[2];
});

Look in test/index.js for more examples and tests.

thanks

jmar777 for his awesome suspend library which served as the base for fibby

license

MIT

Metadata

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free