Call-Back, Call-Back hell

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜ : ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‚ฌ์šฉ

๋น„๋™๊ธฐ ๋™์ž‘์˜ ์—ฐ์†

  • task1 ์‹คํ–‰ ์ดํ›„์— task2 ์‹คํ–‰

  • task1 ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•ด์„œ task2 ์‹คํ–‰

  • ์ฝœ๋ฐฑ์˜ ์—ฐ์†๋œ ํ˜ธ์ถœ

  • ex) ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ํ›„ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ, ๋‹ค์ˆ˜์˜ ์ด๋ฏธ์ง€์—์„œ ์ธ๋„ค์ผ ์ƒ์„ฑ ํ›„ ์—…๋กœ๋“œ

  • ์˜ˆ์ œ ์ฝ”๋“œ

function task1(args,function(result){
  var arg2 = result.value;
  task2(arg2,function(result){
 
  });
});

Call-Back ํƒˆ์ถœํ•˜๊ธฐ

function task1(callback) {
	console.log('Task1 ์‹œ์ž‘');
	setTimeout(function() {
		console.log('Task1 ๋');
		callback();
	}, 300);
}
 
 
function task2(callback) {
	console.log('Task2 ์‹œ์ž‘');
	setTimeout(function() {
		console.log('Task2 ๋');
		callback();
	}, 200);
}
 
task1(function() {
	task2(function() {
 
	});
});
  • ๊ฒฐ๊ณผ ํ™”๋ฉด

Async

  • ๋น„๋™๊ธฐ ๋™์ž‘์˜ ํ๋ฆ„ ์ œ์–ด ๋ชจ๋“ˆ
  • ์„ค์น˜๋ฐฉ๋ฒ• : npm install async

Async ๋Œ€ํ‘œ์ ์ธ ๊ธฐ๋Šฅ

  • ์ˆœ์„œ ์ œ์–ด : series, seriesEach, parallels, waterfall
  • ์ฝœ๋ ‰์…˜(๋ฐฐ์—ด, ๊ฐ์ฒด) : each, forEachOf, map, filter

series(tasks,callback)

  • ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰
  • call-backํ˜ธ์ถœ : ๋‹ค์Œ Task๋กœ ์ง„ํ–‰
  • Task ์‹คํ–‰ ์ค‘ ์—๋Ÿฌ : ๋‹ค์Œ Task๋กœ ์‹คํ–‰ X โ†’ ๋งˆ๋ฌด๋ฆฌ ์ฝœ๋ฐฑ์œผ๋กœ ์—๋Ÿฌ ์ „๋‹ฌ
async.series(
  [task1, task2, task3], function(err, results) { // ์™„๋ฃŒ Call-Back
	if ( err ) {
		console.error('Error : ', err);
		return;
	}
	console.log('๋น„๋™๊ธฐ ๋™์ž‘ ๋ชจ๋‘ ์ข…๋ฃŒ ', results)
  // result์—๋Š” ๊ฐ Task์˜ ๊ฒฐ๊ณผ๊ฐ€ Array ํ˜•ํƒœ๋กœ ์ „๋‹ฌ
});

waterfall

  • ์ด์ „ Task์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋‹ค์Œ Task Parameter๋กœ ์ „๋‹ฌ
async.waterfall([
  function task1(callback) {
    callback(null,'value');
  },
  function task2(args, callback) {
    callback(null,'value1','value2');
  },
  function task3(arg1, args2, callback) {
    callback(null,'value1','value2','value3');
  }
],
function(err, result){
}
);

parallel

  • ์—ฌ๋Ÿฌ Task๋ฅผ ๋™์‹œ์— ์‹คํ–‰
  • ๋ชจ๋“  Task๋ฅผ ๋งˆ์น˜๋ฉด ์™„๋ฃŒ ์ฝœ๋ฐฑ
async.parallel([
  function (callback) {
    callback(null,'value1');
  },
  function (callback) {
    callback(null,'value2');
  },
  function (callback) {
    callback(null,'value2');
  }
  ]
  function(err, result){
  }
);

๋น„๋™๊ธฐ ์ˆœํšŒ ๋™์ž‘ each

  • each(arr,iterator,callback)
async.each(arrary, function(item,callback){
  // ๋ฐฐ์—ด ๋‚ด ํ•ญ๋ชฉ item์„ ์‚ฌ์šฉํ•˜๋Š” ๋น„๋™๊ธฐ ๋™์ž‘
  callback(null);
}, function(err){
  // async.each ์™„๋ฃŒ
})

Promise

  • ๋น„๋™๊ธฐ ๋™์ž‘์˜ ํ๋ฆ„์ œ์–ด
  • JavaScript ES6์— ์ถ”๊ฐ€
new Promise(function(){
  // ๋น„๋™๊ธฐ ๋™์ž‘
});

Promise์˜ ์ƒํƒœ

  • pending : ๋™์ž‘ ์™„๋ฃŒ ์ „
  • fullfilled : ๋น„๋™๊ธฐ ๋™์ž‘ ์„ฑ๊ณต
  • rejected : ๋™์ž‘ ์‹คํŒจ
  • ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ : fullfilled ํ˜ธ์ถœ
  • ์—๋Ÿฌ์ƒํ™ฉ : rejected ํ˜ธ์ถœ

Promise ์ดํ›„์˜ ๋™์ž‘ : then

function task1(fullfill, reject) {
	console.log('Task1 ์‹œ์ž‘');
	setTimeout(function() {
		console.log('Task1 ๋');
		//fullfill('Task1 ๊ฒฐ๊ณผ');
		reject('Error msg');
	}, 300);
}
 
function fullfilled(result) {
	console.log('fullfilled : ', result);
}
 
function rejected(err) {
	console.log('rejected : ', err);
}
 
new Promise(task1).then(fullfilled, rejected);

Promise๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Task

function task(){
  return new Promise(function(fullfill,reject){
      if(success)
        fullfill('Success');
      else
        reject('Error');
  });
}