master
Sven Slootweg 8 years ago
parent b81efc5bb0
commit 99d668e73c

@ -0,0 +1,60 @@
# promisify-simple-callback
Promisifies a function that expects a callback with a single (result) argument - in other words, a callback that looks like `function(result) { ... }` - in what should be a reasonably performant manner.
Because sometimes, a module just doesn't conform to the Node.js callback convention.
## License
[WTFPL](http://www.wtfpl.net/txt/copying/) or [CC0](https://creativecommons.org/publicdomain/zero/1.0/), whichever you prefer. A donation and/or attribution are appreciated, but not required.
## Donate
My income consists largely of donations for my projects. If this module is useful to you, consider [making a donation](http://cryto.net/~joepie91/donate.html)!
You can donate using Bitcoin, PayPal, Flattr, cash-in-mail, SEPA transfers, and pretty much anything else.
## Contributing
Pull requests welcome. Please make sure your modifications are in line with the overall code style, and ensure that you're editing the files in `src/`, not those in `lib/`.
Build tool of choice is `gulp`; simply run `gulp` while developing, and it will watch for changes.
Be aware that by making a pull request, you agree to release your modifications under the licenses stated above.
## Usage
```javascript
var Promise = require("bluebird");
var promisifySimpleCallback = require("promisify-simple-callback");
/* Pretend that brokenAsyncMethod comes from a third-party library. */
function brokenAsyncMethod(someArg, options, cb) {
doSomething(options, function(err, result) {
cb(result);
})
}
/* Promisify it! */
var promisifiedAsyncMethod = promisifySimpleCallback(brokenAsyncMethod, [null, {}]);
/* Now we can use it normally. */
Promise.try(function() {
return promisifiedAsyncMethod("foobar");
}).then(function(result) {
console.log("Done!", result);
});
```
## API
### promisifySimpleCallback(func, [defaults])
Promisifies the given `func`. The promisified method will also catch any synchronous errors, and propagate them as rejections.
You can also specify default argument values; often, there are optional arguments that come before the callback, and by specifying default values, you can make these arguments *really* optional.
Because promisification works by appending a callback at the end of the arguments list, you would otherwise have to include all the optional arguments just to make sure the callback ends up in the right place.
* __func__: The callback-expecting function to promisify.
* __defaults__: *Optional.* An array of default arguments to fill in. Any argument for which you specify `null` will be skipped - that is, it will be left exactly as is. This means that, for an unspecified argument, it is left to `undefined`.

@ -0,0 +1,24 @@
var gulp = require('gulp');
var gutil = require('gulp-util');
var babel = require('gulp-babel');
var cache = require('gulp-cached');
var remember = require('gulp-remember');
var plumber = require('gulp-plumber');
var source = ["src/**/*.js"]
gulp.task('babel', function() {
return gulp.src(source)
.pipe(plumber())
.pipe(cache("babel"))
.pipe(babel({presets: ["es2015"]}).on('error', gutil.log)).on('data', gutil.log)
.pipe(remember("babel"))
.pipe(gulp.dest("lib/"));
});
gulp.task('watch', function () {
gulp.watch(source, ['babel']);
});
gulp.task('default', ['babel', 'watch']);

@ -0,0 +1,3 @@
'use strict';
module.exports = require("./lib");

@ -0,0 +1,37 @@
'use strict';
var Promise = require("bluebird");
module.exports = function (method) {
var defaults = arguments.length <= 1 || arguments[1] === undefined ? [] : arguments[1];
return function () {
var _arguments = arguments,
_this = this;
return new Promise(function (resolve, reject) {
var args = new Array(Math.max(_arguments.length, defaults.length) + 1);
for (var i = 0; i < args.length; ++i) {
args[i] = _arguments[i];
}
if (_arguments.length - 1 < defaults.length) {
for (var i = _arguments.length - 1; i < defaults.length; i++) {
if (defaults[i] != null) {
args[i] = defaults[i];
}
}
}
args[args.length - 1] = function (result) {
resolve(result);
};
console.log(args);
// Synchronous errors are caught and propagated by Bluebird's `new Promise` already.
method.apply(_this, args);
});
};
};

@ -0,0 +1,32 @@
{
"name": "promisify-simple-callback",
"version": "1.0.0",
"description": "Promisifies a function that expects a callback with a single (result) argument",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git://github.com/joepie91/node-promisify-simple-callback"
},
"keywords": [
"promisify",
"bluebird",
"promise"
],
"author": "Sven Slootweg",
"license": "WTFPL",
"dependencies": {
"bluebird": "^3.3.3"
},
"devDependencies": {
"babel-preset-es2015": "^6.6.0",
"gulp": "^3.9.1",
"gulp-babel": "^6.1.2",
"gulp-cached": "^1.1.0",
"gulp-plumber": "^1.1.0",
"gulp-remember": "^0.3.0",
"gulp-util": "^3.0.7"
}
}

@ -0,0 +1,33 @@
'use strict';
const Promise = require("bluebird");
module.exports = function(method, defaults = []) {
return function() {
return new Promise((resolve, reject) => {
var args = new Array(Math.max(arguments.length, defaults.length) + 1);
for(var i = 0; i < args.length; ++i) {
args[i] = arguments[i];
}
if (arguments.length - 1 < defaults.length) {
for(var i = arguments.length - 1; i < defaults.length; i++) {
if (defaults[i] != null) {
args[i] = defaults[i];
}
}
}
args[args.length - 1] = function(result) {
resolve(result);
}
console.log(args);
// Synchronous errors are caught and propagated by Bluebird's `new Promise` already.
method.apply(this, args);
})
}
}
Loading…
Cancel
Save