Comparing version 1.0.0 to 2.0.0
86
index.js
'use strict' | ||
var Promise = require('promise') | ||
var PromiseConstructor; | ||
if (typeof Promise === 'function') { | ||
PromiseConstructor = Promise; | ||
} | ||
module.exports = throat | ||
function throat(size, fn) { | ||
var queue = [] | ||
function run(fn, self, args) { | ||
if (size) { | ||
size-- | ||
var result = new Promise(function (resolve) { | ||
resolve(fn.apply(self, args)) | ||
}) | ||
result.done(release, release) | ||
return result | ||
} else { | ||
return new Promise(function (resolve) { | ||
queue.push(new Delayed(resolve, fn, self, args)) | ||
}) | ||
module.exports = function (PromiseArgument) { | ||
var Promise; | ||
function throat(size, fn) { | ||
var queue = [] | ||
function run(fn, self, args) { | ||
if (size) { | ||
size-- | ||
var result = new Promise(function (resolve) { | ||
resolve(fn.apply(self, args)) | ||
}) | ||
result.done(release, release) | ||
return result | ||
} else { | ||
return new Promise(function (resolve) { | ||
queue.push(new Delayed(resolve, fn, self, args)) | ||
}) | ||
} | ||
} | ||
} | ||
function release() { | ||
size++ | ||
if (queue.length) { | ||
var next = queue.shift() | ||
next.resolve(run(next.fn, next.self, next.args)) | ||
function release() { | ||
size++ | ||
if (queue.length) { | ||
var next = queue.shift() | ||
next.resolve(run(next.fn, next.self, next.args)) | ||
} | ||
} | ||
} | ||
if (typeof fn === 'function') { | ||
return function () { | ||
var args = arguments | ||
return run(fn, this, arguments) | ||
if (typeof size === 'function' && typeof fn === 'number') { | ||
var temp = fn; | ||
fn = size; | ||
size = fn; | ||
} | ||
} else { | ||
return function (fn) { | ||
return run(fn, this, Array.prototype.slice.call(arguments, 1)) | ||
if (typeof fn === 'function') { | ||
return function () { | ||
var args = []; | ||
for (var i = 0; i < arguments.length; i++) { | ||
args.push(arguments[i]); | ||
} | ||
return run(fn, this, args) | ||
} | ||
} else { | ||
return function (fn) { | ||
var args = []; | ||
for (var i = 1; i < arguments.length; i++) { | ||
args.push(arguments[i]); | ||
} | ||
return run(fn, this, args) | ||
} | ||
} | ||
} | ||
if (typeof arguments[0] === 'number' || typeof arguments[1] === 'number') { | ||
Promise = PromiseConstructor; | ||
return throat(arguments[0], arguments[1]); | ||
} else { | ||
Promise = PromiseArgument; | ||
return throat; | ||
} | ||
} | ||
@@ -46,2 +70,2 @@ | ||
this.args = args || null | ||
} | ||
} |
{ | ||
"name": "throat", | ||
"version": "1.0.0", | ||
"version": "2.0.0", | ||
"description": "Throttle the parallelism of an asynchronous (promise returning) function / functions", | ||
@@ -14,10 +14,15 @@ "keywords": [ | ||
], | ||
"dependencies": { | ||
"promise": "~3.2.0" | ||
}, | ||
"dependencies": {}, | ||
"devDependencies": { | ||
"mocha": "*" | ||
"coveralls": "^2.11.2", | ||
"istanbul": "^0.3.5", | ||
"promise": "^6.1.0", | ||
"sauce-test": "^1.0.0", | ||
"test-result": "^2.0.0", | ||
"testit": "^2.0.2" | ||
}, | ||
"scripts": { | ||
"test": "mocha -R spec" | ||
"test": "node test/index.js && node test/browser.js", | ||
"coverage": "istanbul cover test/index.js", | ||
"coveralls": "npm run coverage && cat ./coverage/lcov.info | coveralls" | ||
}, | ||
@@ -24,0 +29,0 @@ "repository": { |
@@ -5,6 +5,9 @@ # throat | ||
[![Build Status](https://travis-ci.org/ForbesLindesay/throat.png?branch=master)](https://travis-ci.org/ForbesLindesay/throat) | ||
[![Dependency Status](https://gemnasium.com/ForbesLindesay/throat.png)](https://gemnasium.com/ForbesLindesay/throat) | ||
[![NPM version](https://badge.fury.io/js/throat.png)](http://badge.fury.io/js/throat) | ||
[![Build Status](https://img.shields.io/travis/ForbesLindesay/throat/master.svg)](https://travis-ci.org/ForbesLindesay/throat) | ||
[![Coverage Status](https://img.shields.io/coveralls/ForbesLindesay/throat/master.svg?style=flat)](https://coveralls.io/r/ForbesLindesay/throat?branch=master) | ||
[![Dependency Status](https://img.shields.io/gemnasium/ForbesLindesay/throat.svg)](https://gemnasium.com/ForbesLindesay/throat) | ||
[![NPM version](https://img.shields.io/npm/v/throat.svg)](http://badge.fury.io/js/throat) | ||
[![Sauce Test Status](https://saucelabs.com/browser-matrix/throat.svg)](https://saucelabs.com/u/throat) | ||
## Installation | ||
@@ -23,3 +26,7 @@ | ||
```js | ||
// with polyfill or in iojs | ||
require('promise/polyfill') | ||
var throat = require('throat')(2) | ||
// alternatively provide your own promise implementation | ||
var throat = require('throat')(require('promise'))(2) | ||
@@ -53,2 +60,8 @@ var resA = throat(function () { | ||
```js | ||
// with polyfill or in iojs | ||
require('promise/polyfill') | ||
var throat = require('throat') | ||
// alternatively provide your own promise implementation | ||
var throat = require('throat')(require('promise')) | ||
var input = ['fileA.txt', 'fileB.txt', 'fileC.txt', 'fileD.txt'] | ||
@@ -64,2 +77,2 @@ var data = Promise.all(input.map(throat(2, function (fileName) { | ||
MIT | ||
MIT |
@@ -0,4 +1,7 @@ | ||
'use strict'; | ||
var assert = require('assert'); | ||
var test = require('testit'); | ||
var Promise = require('promise'); | ||
var assert = require('assert'); | ||
var throat = require('../'); | ||
var throat = require('../')(Promise); | ||
@@ -46,4 +49,4 @@ var sentA = {}, sentB = {}, sentC = {} | ||
describe('throat(n)', function () { | ||
it('throat(1) acts as a lock', function (done) { | ||
test('throat(n)', function () { | ||
test('throat(1) acts as a lock', function (done) { | ||
var lock = throat(1) | ||
@@ -83,3 +86,3 @@ var a = job(), b = job(), c = job(); | ||
}) | ||
it('throat(2) lets two processes acquire the same lock', function (done) { | ||
test('throat(2) lets two processes acquire the same lock', function (done) { | ||
var lock = throat(2) | ||
@@ -119,3 +122,3 @@ var a = job(), b = job(), c = job(); | ||
}) | ||
it('throat(3) lets three processes acquire the same lock', function (done) { | ||
test('throat(3) lets three processes acquire the same lock', function (done) { | ||
var lock = throat(3) | ||
@@ -158,4 +161,4 @@ var a = job(), b = job(), c = job(); | ||
describe('throat(n, fn)', function () { | ||
it('throat(1, fn) acts as a sequential worker', function (done) { | ||
test('throat(n, fn)', function () { | ||
test('throat(1, fn) acts as a sequential worker', function (done) { | ||
Promise.all([sentA, sentB, sentC].map(throat(1, worker(1)))) | ||
@@ -169,3 +172,3 @@ .then(function (res) { | ||
}) | ||
it('throat(2, fn) works on two inputs in parallel', function (done) { | ||
test('throat(2, fn) works on two inputs in parallel', function (done) { | ||
Promise.all([sentA, sentB, sentC].map(throat(2, worker(2)))) | ||
@@ -179,3 +182,3 @@ .then(function (res) { | ||
}) | ||
it('throat(3, fn) works on three inputs in parallel', function (done) { | ||
test('throat(3, fn) works on three inputs in parallel', function (done) { | ||
Promise.all([sentA, sentB, sentC].map(throat(3, worker(3)))) | ||
@@ -189,2 +192,2 @@ .then(function (res) { | ||
}) | ||
}) | ||
}) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
12599
0
8
289
75
0
6
2
- Removedpromise@~3.2.0
- Removedpromise@3.2.0(transitive)