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