News for hackers. Stuff that matters.
Re:JavaScript Promises: There and back again by astrodust on Tuesday December 17, 2013 @12:17PM (#6922242)
I've just been using the Q promise library and it works fine in NodeJS. The Q wrappers for NodeJS style functions is a bit ugly, but it works very well.

The real problem is the core NodeJS libraries aren't promise compliant. I don't know if there's a module that cleanly wraps all of these in their promise analogs but that'd be the best thing here.

Calling Q.nsend() on everything is messy, but is a lot better than dealing with ridiculously nested callbacks.

Re:JavaScript Promises: There and back again by JoshGlazebrook on Tuesday December 17, 2013 @01:45PM (#6922905)
Have you looked into bluebird[1]? It and most of the available promise libraries have a nodify-esque function where you can simple do this:

    var fs = Promise.promisifyAll(require("fs"));
And all of the regular methods in fs are now promisable. Q also seems to be one of the slowest[2] promise libraries there is. I'm not sure why so many people use it. That guy has a rather large benchmark table from a couple months ago as well and Q seems to be shockingly slow compared to the dozen or so other promise libraries out there.

1. https://github.com/petkaantonov/bluebird

2. http://spion.github.io/posts/why-i-am-switching-to-promises....

Re:JavaScript Promises: There and back again by mjackson on Tuesday December 17, 2013 @01:05PM (#6922623)
> The real problem is the core NodeJS libraries aren't promise compliant.

This isn't a problem at all in practice.

To say that node core is not "promise compliant" gives people the idea that there is something that prevents them from using promises in node. In reality, most promise libraries have a "denodeify" function that will convert any function that expects a node-style callback into one that returns a promise instead.

  var fs = require('fs');
  var rsvp = require('rsvp');
  
  // Create a version of fs.readFile that returns
  // a promise instead of expecting a callback.
  var readFile = rsvp.denodeify(fs.readFile);
  
  readFile('/etc/passwd', 'utf8').then(function (contents) {
    // do something with the file contents
  }, function (error) {
    // handle the error
  });
It is similarly easy to convert functions that expect other types of callbacks (read: not node-style callbacks where the first argument is always an error) to functions that return promises using deferreds.
Re:JavaScript Promises: There and back again by astrodust on Tuesday December 17, 2013 @05:55PM (#6924576)
That's a good pattern, but obnoxious to apply on large numbers of functions. If something just did this for you in advance, that'd be what I'm looking for.

Trouble is, NodeJS set a convention and now everyone adheres to it. I'm not complaining there's standards, in fact that's a good thing. Part of me is just disappointed that the promise standardization happened too late in the game for NodeJS to build around it.

Re:JavaScript Promises: There and back again by spion on Tuesday December 17, 2013 @07:23PM (#6924977)
It really isn't much of a problem. A lot of the time its as easy as replacing

  var lib = require('lib');
with (given var Promise = require('bluebird'))

  var lib = require('lib');
  Promise.promisifyAll(lib);
And in case of classes, you'd use promisifyAll on about 2-3 prototypes instead.
Re:JavaScript Promises: There and back again by kybernetikos on Wednesday December 18, 2013 @04:25AM (#6926619)
I assume that some future major revision of node will move its API across and that in the meantime, promise versions of core libraries will start appearing on npm.
Re:JavaScript Promises: There and back again by domenicd on Tuesday December 17, 2013 @01:33PM (#6922819)
> The real problem is the core NodeJS libraries aren't promise compliant. I don't know if there's a module that cleanly wraps all of these in their promise analogs but that'd be the best thing here.

There's a few of these in npm, but I think the best one is probably the pr package [1], which lets you do e.g. var fs = require("pr/fs") and then use Bluebird-promise returning versions of the fs methods.

[1]: https://npmjs.org/package/pr