# easy-loop

> Easy sync loop processing for Node.js

Latest version **1.7.2** (published 2017-09-19) · MIT license · 0 weekly downloads

## Install

```sh
npm install easy-loop
pnpm add easy-loop
yarn add easy-loop
bun add easy-loop
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.7.2 |
| Published | 2017-09-19 |
| First published | 2016-01-12 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | humy2833 |
| Maintainers | humy2833 |
| Keywords | serial, loop, forEach, for, while, sync, easy loop, easy for, easy while, sync loop, iteration, step by step, concurrency, async, series, parallel, waterfall |

## Links

- npm: https://www.npmjs.com/package/easy-loop
- Repository: https://github.com/humy2833/easy-loop
- Homepage: https://github.com/humy2833/easy-loop#readme
- Issues: https://github.com/humy2833/easy-loop/issues
- npm.io page: https://npm.io/package/easy-loop

## Alternatives

- [mobx-react](https://npm.io/package/mobx-react.md) — 2.8M weekly downloads
- [rc-tree](https://npm.io/package/rc-tree.md) — 2.6M weekly downloads
- [@react-oauth/google](https://npm.io/package/@react-oauth/google.md) — 1.3M weekly downloads
- [@wagmi/connectors](https://npm.io/package/@wagmi/connectors.md) — 877.0K weekly downloads
- [vee-validate](https://npm.io/package/vee-validate.md) — 836.4K weekly downloads

## Recent versions

- 1.7.2 (latest) — 2017-09-19
- 1.7.1 — 2017-09-19
- 1.7.0 — 2017-09-08
- 1.6.0 — 2017-05-17
- 1.5.2 — 2017-04-19
- 1.5.1 — 2016-12-21
- 1.5.0 — 2016-11-30
- 1.4.8 — 2016-11-29
- 1.4.7 — 2016-11-28
- 1.4.6 — 2016-11-26
- 1.4.5 — 2016-11-26
- 1.3.2 — 2016-11-26
- 1.4.4 — 2016-09-05
- 1.4.3 — 2016-08-25
- 1.4.2 — 2016-08-25
- … 18 more at https://npm.io/package/easy-loop/versions

## README

# easy-loop
	* 쉬운 동기식 반복처리
	* 선택적 병렬처리

## iteration function
	1) Method
		: 모두 같은 동작이며 편리한 메소드를 호출하세요.
		
		var loop = require('easy-loop');
		loop(arg, arg [, arg, arg]) == loop.for() == loop.while()		
		
	2) Arguments	
		(1) Array or Object or function or iteration number	- require
		(2) process function 	- require
		(3) concurrency	number 	- option (default : 1)
		(4) callback function 	- option (default : nothing)
		
		* TIP : arg2 와 arg3 의 인자값은 순서 변경 가능(arg3 and arg3 can be swap)


## series or parallel or waterfall function
	1) Method
		var loop = require('easy-loop');
		//series('function array or object' [, concurrency] [, callback]) -> 'concurrency' default 1
		loop.series([
			function(callback){
				var result = "success";
				callback(null, result);
			},
		...], function(err, results){
			//err : undefined
			//results : ["success"...]
		});

		loop.parallel({
			one : function(callback){
				var result = "success";
				callback(null, result);
			},
		...}, function(err, results){
			//err : undefined
			//results : {"one":"success"...}
		});

		loop.waterfall([
			function(callback){
				var arg1 = 1;				
				callback(null, arg1);
			},
			function(arg, callback){
				//console.log(arg) => 1
				var arg1 = 2;				
				callback(null, arg, arg1);
			},
			function(arg1, arg2, callback){
				//console.log(arg1, arg2) => 1, 2
				var arg1 = 3;				
				callback(null, arg1);
			}], function(err, results){
			//err : undefined
			//console.log(results) => 3
		});

	2) Arguments
		(1) Array or Object (waterfall only Array) - require
		(2) callback function - option
	

## Examples

	var loop = require('easy-loop');
	
	var arr = [1,2,3,4,5];
	console.log("Case1 Start => Array and 3 arguments");
	console.log("Start : Now Second : ", new Date().getSeconds());
	loop(arr, function(i, value, next){
		setTimeout(function(){
			console.log(i, "=>", value, " , Date : ", new Date().getSeconds());
			next();	//require
		}, 1000);
	}, function(err){
		console.log("err : ", err);
		console.log("Case 1 result");
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case1 End => Array");
	
	/* 결과(Result) - 5초 소요(run time : 5 second)
	Case1 Start => Array and 3 arguments
	Start : Now Second :  54
	Case1 End => Array
	0 '=>' 1 ' , Date : ' 55
	1 '=>' 2 ' , Date : ' 56
	2 '=>' 3 ' , Date : ' 57
	3 '=>' 4 ' , Date : ' 58
	4 '=>' 5 ' , Date : ' 59
	err :  undefined
	Case 1 result
	Result : Now Second :  59
	*/
	
	
	
	
	var arr = [1,2,3,4,5];
	console.log("Case2 Start => Array and 2 arguments");
	loop.for(arr, function(i, value, next){
		setTimeout(function(){
			console.log(i, "=>", value);	
			next();		
		}, 1000);
	});
	console.log("Case2 End => Array and 2 arguments");
	
	/* 결과(Result) - 5초 소요(run time : 5 second)
	Case2 Start => Array and 2 arguments
	Case2 End => Array and 2 arguments
	0 '=>' 1
	1 '=>' 2
	2 '=>' 3
	3 '=>' 4
	4 '=>' 5
	*/
	
	
	
	
	var arr = [1,2,3,4,5];
	console.log("Case3 Start => Array and error(or break) and 3 arguments");
	loop(arr, function(i, value, next){
		setTimeout(function(){
			console.log(i, "=>", value);
			if(i === 2)	next("error or break");
			else		next();
		}, 1000);
	}, function(err){
		console.log("err : ", err);
		console.log("Case 3 result");
	});
	console.log("Case3 End => Array and error(or break)");
	
	/* 결과(Result) - 3초 소요(run time : 3 second)
	Case3 Start => Array and error(or break) and 3 arguments
	Case3 End => Array and error(or break)
	0 '=>' 1
	1 '=>' 2
	2 '=>' 3
	err :  error or break
	Case 3 result
	*/
	
	
	
	
	var obj = {a:1,b:2,c:3,d:4,e:5};
	console.log("Case4 Start => Object and 3 arguments");
	loop(obj, function(key, value, next){
		setTimeout(function(){
			console.log(key, "=>", value);
			next();
		}, 1000);
	}, function(err){
		console.log("err : ", err);
		console.log("Case 4 result");
	});
	console.log("Case4 End => Object");
	
	/* 결과(Result) - 5초 소요(run time : 5 second)
	Case4 Start => Object and 3 arguments
	Case4 End => Object
	a => 1
	b => 2
	c => 3
	d => 4
	e => 5
	err :  undefined
	Case 4 result
	*/
	
	
	
	
	
	var arr = [];	// or {}
	console.log("Case5 Start => Empty Array and 3 arguments");
	loop(arr, function(i, value, next){
		setTimeout(function(){
			console.log(i, "=>", value);
			next();
		}, 1000);
	}, function(err){
		console.log("err : ", err);
		console.log("Case5 result");
	});
	console.log("Case5 End => Empty Array");
	
	/* 결과(Result) - 0초 소요(run time : 0 second)
	Case5 Start => Empty Array and 3 arguments
	err :  undefined
	Case5 result
	Case5 End => Empty Array
	*/
	
	
	
	
	
	var arr = [1,2,3,4,5];
	console.log("Case6 Start => concurrency and 4 arguments");
	console.log("Start : Now Second : ", new Date().getSeconds());
	loop(arr, function(i, value, next){
		setTimeout(function(){
			console.log(i, "=>", value, " , Date : ", new Date().getSeconds());
			next();
		}, 1000);
	}, 3, function(err){
		console.log("err : ", err);
		console.log("Case 6 result");
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case6 End => concurrency");
	
	/*
	*Tip : arguments(arr, function, concurrency, callback) == arguments(arr, concurrency, function, callback) 
	결과(Result) - 2초 소요(run time : 2 second)
	Case6 Start => concurrency and 4 arguments
	Start : Now Second :  3
	Case6 End => concurrency
	0 '=>' 1 ' , Date : ' 4
	1 '=>' 2 ' , Date : ' 4
	2 '=>' 3 ' , Date : ' 4
	3 '=>' 4 ' , Date : ' 5
	4 '=>' 5 ' , Date : ' 5
	err :  undefined
	Case 6 result
	Result : Now Second :  5
	*/
	
	
	
	
	
	
	var num = 0;
	console.log("Case7 Start => while and 3 arguments");
	console.log("Start : Now Second : ", new Date().getSeconds());
	loop.while(function(){
		return num < 5;
	}, function(next){
		setTimeout(function(){
			console.log("Date : ", new Date().getSeconds());
			num++;
			next();
		}, 1000);
	}, function(err){
		console.log("err : ", err);
		console.log("Case 7 result");
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case7 End");
	
	/*
	결과(Result) - 5초 소요(run time : 5 second)
	Case7 Start => while and 3 arguments
	Start : Now Second :  20
	Case7 End
	Date :  21
	Date :  22
	Date :  23
	Date :  24
	Date :  25
	err :  undefined
	Case 7 result
	Result : Now Second :  25
	*/
	
	
	
	
	var num = 0;
	console.log("Case8 Start => while and 3 arguments and break(or error)");
	console.log("Start : Now Second : ", new Date().getSeconds());
	loop.while(function(){
		return num < 5;
	}, function(next){
		setTimeout(function(){
			console.log("Date : ", new Date().getSeconds());
			num++;
			next(num === 1 ? true : false);
		}, 1000);
	}, function(err){
		console.log("err : ", err);
		console.log("Case 8 result");
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case8 End");
	
	/*
	Case8 Start => while and 3 arguments and break(or error)
	Start : Now Second :  21
	Case8 End
	Date :  22
	err :  true
	Case 8 result
	Result : Now Second :  22
	*/



	console.log("Case9 Start => When only know the number of iterations. 2 arguments or 3 arguments(concurrency) and break possible");
	console.log("Start : Now Second : ", new Date().getSeconds());
	var loopCount = 5;
	loop(loopCount, function(i, next){
		setTimeout(function(){
			console.log(i, "Date : ", new Date().getSeconds());
			next();	// break => next(err);
		}, 1000);
	}, function(err){
		console.log("err : ", err);
		console.log("Case 9 result");
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case9 End");

	/*
	Case9 Start => When only know the number of iterations. 2 arguments or 3 arguments(concurrency) and break possible
	Start : Now Second :  23
	Case9 End
	0 'Date : ' 24
	1 'Date : ' 25
	2 'Date : ' 26
	3 'Date : ' 27
	4 'Date : ' 28
	err :  undefined
	Case 9 result
	Result : Now Second :  28
	*/




	console.log("Case10 Start => When only know the number of iterations. break possible");
	console.log("Start : Now Second : ", new Date().getSeconds());
	var handle = loop.create(10, function(err){
		console.log("err : ", err);
		console.log("Case 10 result");
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	for(var i=0; i<10; i++)
	{
		setTimeout(function(){
			console.log("Date : ", new Date().getSeconds());
			handle.next();	// break => handle.next(err);
		}, 1000);
	}
	console.log("Case10 End");

	/*
	Case10 Start => When only know the number of iterations
	Start : Now Second :  20
	Case10 End
	Date :  21
	Date :  21
	Date :  21
	Date :  21
	Date :  21
	Date :  21
	Date :  21
	Date :  21
	Date :  21
	Date :  21
	err :  undefined
	Case 10 result
	Result : Now Second :  21
	*/




	console.log("Case11 Start => Array. Like as 'async.series' of async module. If the error is when to stop.");
	console.log("Start : Now Second : ", new Date().getSeconds());
	var arr = [
		function(callback){
			console.log("start series");
			callback();
		},
		function(callback){
			setTimeout(function(){
				console.log(100);
				callback(null, 100);
			}, 1000);
		}, function(callback){
			setTimeout(function(){
				console.log(200);
				callback(null, 200);
			}, 1000);
		}
	];
	loop.series(arr, function(err, results){
		console.log("err : ", err);
		console.log("results : ", JSON.stringify(results));
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case11 End");

	/*
	Case11 Start => Array. Like as 'async.series' of async module. If the error is when to stop.
	Start : Now Second :  50
	start series
	Case11 End
	100
	200
	err :  undefined
	results :  [null,100,200]
	Result : Now Second :  52
	*/




	console.log("Case12 Start => Object. Like as 'async.series' of async module. If the error is when to stop.");
	console.log("Start : Now Second : ", new Date().getSeconds());
	var obj = {
		one :	function(callback){
			console.log("start series");
			callback();
		},
		two : function(callback){
			setTimeout(function(){
				console.log(100);
				callback(null, 100);
			}, 1000);
		}, 
		three : function(callback){
			setTimeout(function(){
				console.log(200);
				callback(null, 200);
			}, 1000);
		}
	};
	loop.series(obj, function(err, results){
		console.log("err : ", err);
		console.log("results : ", JSON.stringify(results));
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case12 End");

	/*
	Case12 Start => Object. Like as 'async.series' of async module. If the error is when to stop.
	Start : Now Second :  38
	start series
	Case12 End
	100
	200
	err :  undefined
	results :  {"one":null,"two":100,"three":200}
	Result : Now Second :  40
	*/
	




	console.log("Case13 Start => Array. Like as 'async.parallel' of async module. If the error is when to stop.");
	console.log("Start : Now Second : ", new Date().getSeconds());
	var arr = [
		function(callback){
			console.log("start parallel");
			callback();
		},
		function(callback){
			setTimeout(function(){
				console.log(100);
				callback(null, 100);
			}, 500);
		}, function(callback){
			setTimeout(function(){
				console.log(200);
				callback(null, 200);
			}, 500);
		}
	];
	loop.parallel(arr, function(err, results){
		console.log("err : ", err);
		console.log("results : ", JSON.stringify(results));
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case13 End");

	/*
	Case13 Start => Array. Like as 'async.parallel' of async module. If the error is when to stop.
	Start : Now Second :  55
	start parallel
	Case13 End
	100
	200
	err :  undefined
	results :  [null,100,200]
	Result : Now Second :  55
	*/




	console.log("Case14 Start => Object. Like as 'async.parallel' of async module. If the error is when to stop.");
	console.log("Start : Now Second : ", new Date().getSeconds());
	var obj = {
		one :	function(callback){
			console.log("start parallel");
			callback();
		},
		two : function(callback){
			setTimeout(function(){
				console.log(100);
				callback(null, 100);
			}, 500);
		}, 
		three : function(callback){
			setTimeout(function(){
				console.log(200);
				callback(null, 200);
			}, 500);
		}
	};
	loop.parallel(obj, function(err, results){
		console.log("err : ", err);
		console.log("results : ", JSON.stringify(results));
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case14 End");

	/*
	Case14 Start => Object. Like as 'async.parallel' of async module. If the error is when to stop.
	Start : Now Second :  59
	start parallel
	Case14 End
	100
	200
	err :  undefined
	results :  {"one":null,"two":100,"three":200}
	Result : Now Second :  59
	*/




	console.log("Case15 Start => Array(or Object). Like as 'async.series'. But sub functions run parallel.");
	console.log("Start : Now Second : ", new Date().getSeconds());
	var obj = [
		[
			function(cb){
				setTimeout(function(){console.log(new Date().getSeconds(), "sub1");
				cb(null, "sub1");}, 1000)
		}, 
			function(cb){
				setTimeout(function(){console.log(new Date().getSeconds(), "sub2");
				cb(null, "sub2");}, 1000)
			}
		],
		function(callback){
			setTimeout(function(){
				console.log(new Date().getSeconds(), 100);
				callback(null, 100);
			}, 1000);
		}, 
		function(callback){
			setTimeout(function(){
				console.log(new Date().getSeconds(), 200);
				callback(null, 200);
			}, 1000);
		}
	];
	loop.series(obj, function(err, results){
		console.log("err : ", err);
		console.log("results : ", JSON.stringify(results));
		console.log("Result : Now Second : ", new Date().getSeconds());
	});
	console.log("Case15 End");

	/*
	Case15 Start => Array(or Object). Like as 'async.series'. But sub functions run
	parallel.
	Start : Now Second :  59
	Case15 End
	0 'sub1'
	0 'sub2'
	1 100
	2 200
	err :  undefined
	results :  [["sub1","sub2"],100,200]
	Result : Now Second :  2
	*/

---
_Source: https://npm.io/package/easy-loop · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
