promise-resolve-deep
Advanced tools
+37
| 'use strict'; | ||
| let Benchmark = require('benchmark'); | ||
| function testPromise(label, Promise) { | ||
| require('./index')(Promise) | ||
| var suite = new Benchmark.Suite; | ||
| suite | ||
| .add(`${label}#resolveDeep`, function(deferred) { | ||
| Promise.resolveDeep(Promise.resolve({ | ||
| foo: Promise.resolve({ | ||
| bar: [Promise.resolve('foo'),Promise.resolve({ | ||
| xx: Promise.resolve().then(()=>'ala'), | ||
| dd: null, | ||
| zz: true, | ||
| yy: false, | ||
| mm: undefined | ||
| })] | ||
| }) | ||
| }), { | ||
| foo: {bar: ['foo', {xx: 'ala', dd: null, zz: true, yy: false, mm: undefined}]} | ||
| }).then(() => deferred.resolve()); | ||
| }, {defer: true}) | ||
| // add listeners | ||
| .on('cycle', function(event) { | ||
| console.log(String(event.target)); | ||
| }) | ||
| .on('complete', function() { | ||
| console.log('Fastest is ' + this.filter('fastest').map('name')); | ||
| }) | ||
| // run async | ||
| .run({ 'async': true }); | ||
| } | ||
| testPromise('bluebird', require('bluebird')); | ||
| testPromise('default', Promise); |
+30
| 'use strict'; | ||
| module.exports = function setupResolveDeep(Promise) { | ||
| let promiseMap = Promise.map || function mapImpl(promiseList, functor) { | ||
| return Promise.all(promiseList.map(promiseOrValue => | ||
| Promise.resolve(promiseOrValue).then(functor) | ||
| )); | ||
| }; | ||
| return Promise.resolveDeep = function resolveNestedPromises(obj) { | ||
| return Promise.resolve(obj).then(obj => { | ||
| if(Array.isArray(obj)) { | ||
| return promiseMap(obj, resolveNestedPromises); | ||
| } | ||
| else if(obj && typeof obj === 'object' ) { | ||
| let promisesToResolve = []; | ||
| Object.keys(obj).map(key => { | ||
| let promise = resolveNestedPromises(obj[key]).then(val => { | ||
| obj[key] = val; | ||
| }); | ||
| promisesToResolve.push(promise) | ||
| }); | ||
| if(promisesToResolve.length) { | ||
| return Promise.all(promisesToResolve).then(() => obj); | ||
| } | ||
| } | ||
| return obj; | ||
| }); | ||
| }; | ||
| }; |
+26
| require('./')(Promise); | ||
| var middleware = wrap(() => { | ||
| return { | ||
| users: [Promise.resolve('dd')], | ||
| books: [Promise.resolve('ff')] | ||
| }; | ||
| }); | ||
| // utilizing Promise.resolveDeep | ||
| function wrap(func) { | ||
| return (req, res) => { | ||
| Promise.resolve().then(() => func()) | ||
| .then(Promise.resolveDeep).then(data => { | ||
| res.json(data); | ||
| }).catch(err => res.status(500)); | ||
| } | ||
| } | ||
| middleware({ | ||
| }, { | ||
| json(data) { | ||
| console.log('GOT JSON', data); | ||
| } | ||
| } ); |
+14
-10
@@ -9,2 +9,12 @@ 'use strict'; | ||
| }; | ||
| let promiseProps = Promise.props || function propsImpl(obj) { | ||
| let promisesToResolve = []; | ||
| Object.keys(obj).map(key => { | ||
| let promise = Promise.resolve(obj[key]).then(val => { | ||
| obj[key] = val; | ||
| }); | ||
| promisesToResolve.push(promise) | ||
| }); | ||
| return Promise.all(promisesToResolve).then(() => obj); | ||
| }; | ||
@@ -16,13 +26,7 @@ return Promise.resolveDeep = function resolveNestedPromises(obj) { | ||
| } | ||
| else if(obj && typeof obj === 'object' ) { | ||
| let promisesToResolve = []; | ||
| Object.keys(obj).map(key => { | ||
| let promise = resolveNestedPromises(obj[key]).then(val => { | ||
| obj[key] = val; | ||
| }); | ||
| promisesToResolve.push(promise) | ||
| }); | ||
| if(promisesToResolve.length) { | ||
| return Promise.all(promisesToResolve).then(() => obj); | ||
| else if(obj && typeof obj === 'object' && obj.constructor === Object) { | ||
| for(var key in obj) { | ||
| obj[key] = resolveNestedPromises(obj[key]); | ||
| } | ||
| return promiseProps(obj); | ||
| } | ||
@@ -29,0 +33,0 @@ return obj; |
+8
-6
| { | ||
| "name": "promise-resolve-deep", | ||
| "version": "1.0.1", | ||
| "version": "1.0.2", | ||
| "description": "Resolve a promise or value and all of its embedded promises (key values, elements of array, including nested)", | ||
@@ -19,10 +19,12 @@ "main": "index.js", | ||
| "devDependencies": { | ||
| "benchmark": "^2.1.0", | ||
| "bluebird": "^3.3.3", | ||
| "chai": "^3.5.0", | ||
| "mocha": "^2.4.5", | ||
| "bluebird": "^3.3.3" | ||
| "microtime": "^2.1.0", | ||
| "mocha": "^2.4.5" | ||
| }, | ||
| "repository" : { | ||
| "type" : "git" | ||
| , "url" : "https://github.com/virtkick/promise-resolve-deep.git" | ||
| "repository": { | ||
| "type": "git", | ||
| "url": "https://github.com/virtkick/promise-resolve-deep.git" | ||
| } | ||
| } |
+32
-2
@@ -12,3 +12,3 @@ ## promise-resolve-deep | ||
| It can more or less be used like `Proimse.resolve` but will recursively/deep travel and resolve all nested promises. | ||
| Use it like `Proimse.resolve` and it will recursively/deep travel and resolve all nested promises in arrays and objects. Also any object or an array that any promise resolves to, will be deeply resolved too. | ||
@@ -34,4 +34,34 @@ ```js | ||
| # License | ||
| ## Fun with APIs | ||
| ```js | ||
| // app is express application | ||
| // User and Book are bookshelf.js models | ||
| // needs: require('promise-resolve-deep')(Promise); to install the .resolveDeep method | ||
| app.get('/resources', wrap(() => { | ||
| return { | ||
| users: User.fetchAll().then(users => users.map(user => user.attributes)), | ||
| books: Book.fetchAll().then(books => books.map(book => book.attributes)) | ||
| }; | ||
| })); | ||
| // utilizing Promise.resolveDeep | ||
| function wrap(func) { | ||
| return (req, res) => { | ||
| Promise.resolve().then(() => func()) | ||
| .then(Promise.resolveDeep).then(data => { | ||
| res.json(data); | ||
| }).catch(err => res.status(500)); | ||
| } | ||
| } | ||
| ``` | ||
| If you want to write such declarative Promise-based APIs then you may also like this: https://github.com/virtkick/express-router-api | ||
| ## Author | ||
| Damian Kaczmarek <rush@virtkick.com> | ||
| ## License | ||
| MIT |
+1
-1
| 'use strict'; | ||
| require('chai'); | ||
| let setupResolveDeep = require('./'); | ||
| let setupResolveDeep = require('./index'); | ||
| let assert = require('chai').assert; | ||
@@ -6,0 +6,0 @@ let PromiseBluebird = require('bluebird'); |
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
9558
57.13%10
42.86%186
84.16%66
83.33%5
66.67%1
Infinity%