1.0.0
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…
Reference in New Issue