If you're working with functions that make use of the Node.js callback pattern,where callbacks are in the form of function(err, result)
, Q provides a few useful utility functions for converting between them. The most straightforward are probably Q.nfcall
and Q.nfapply
("Node function call/apply") for calling Node.js-style functions and getting back a promise:
return Q.nfcall(FS.readFile, "foo.txt", "utf-8");
return Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]);
If you are working with methods, instead of simple functions, you can easily run in to the usual problems where passing a method to another function—like Q.nfcall
—"un-binds" the method from its owner. To avoid this, you can either use Function.prototype.bind
or some nice shortcut methods we provide:
return Q.ninvoke(redisClient, "get", "user:1:id");
return Q.npost(redisClient, "get", ["user:1:id"]);
You can also create reusable wrappers with Q.denodeify
or Q.nbind
:
var readFile = Q.denodeify(FS.readFile);
return readFile("foo.txt", "utf-8");
var redisClientGet = Q.nbind(redisClient.get, redisClient);
return redisClientGet("user:1:id");
Finally, if you're working with raw deferred objects, there is a makeNodeResolver
method on deferreds that can be handy:
var deferred = Q.defer();
FS.readFile("foo.txt", "utf-8", deferred.makeNodeResolver());
return deferred.promise;