콜백함수란
다른코드(함수 또는 메서드)에게 인자로 넘겨줌으로써 그 제어권도 함께 위임한 함수
var count = 0;
var cbFunc = function(){
console.log(count);
if (++count > 4) clearInterval(timer);
};
var timer = setInterval(cbFunc, 300);
// 결과 (0.3초마다)
0
1
2
3
4
cbFunc(); => 호출주체 : 사용자, 제어권: 사용자
setInterval(cbFunc, 300); => 호출주체: setInterval, 제어권 : setInterval
Array.prototype.map = function(callback, thisArg) {
var mappedArr = [];
for(var i = 0; i <this.length; i++) {
var mappedValue = callback.call(thisArg || window, this[i], i, this);
mappedArr[i] = mappedValue;
}
return mappedArr;
}
var obj = {
vals : [1,2,3],
logValues: function(v, i) {
console.log(this,v,i);
}
};
obj.logValues(1,2);
[4, 5, 6].forEach(obj.logValues);
// 결과
{vals: Array(3), logValues: ƒ} 1 2
Window {...} 4 0
Window {...} 5 1
Window {...} 6 2
var obj1 = {
name: 'obj1',
func: function () {
var self = this;
return function() {
console.log(self.name);
};
}
};
var callback = obj1.func();
setTimeout(callback, 1000); // obj1
var obj2 = {
name: 'obj2',
func: obj1.func
};
var callback2 = obj2.func();
setTimeout(callback2, 1500); // obj2
var obj3 = { name: 'obj3'};
var callback3 = obj1.func.call(obj3);
setTimeout(callback3, 2000); //obj3
=> func의 재사용을 위해 콜백으로 사용 할 메소드를 변수 할당해서 사용,
변수 할당을 하며 this를 지정해주는 방식
var obj1 = {
name: 'obj1',
func: function () {
console.log(this.name);
}
};
setTimeout(obj1.func.bind(obj1), 1000); // obj1
var obj2 = {name: 'obj2'};
setTimeout(obj1.func.bind(obj2), 1500); // obj2
var addCoffee = function(name) {
return function(prevName) {
return new Promise(function(resolve) {
setTimeout(function() {
var newName = prevName ? (prevName + ', ' + name) : name;
console.log(newName);
resolve(newName);
}, 500);
});
};
};
addCoffee('에스프레소')()
.then(addCoffee('아메리카노'))
.then(addCoffee('카페모카'))
.then(addCoffee('카페라떼'));
var addCoffee = function(prevName, name) {
setTimeout(function() {
coffeeMaker.next(prevName? prevName + ', ' + name : name)
}, 500);
};
var coffeeGenerator = function* () {
var espresso = yield addCoffee('', '에스프레소');
console.log(espresso);
var americano = yield addCoffee(espresso, '아메리카노');
console.log(americano);
var mocha = yield addCoffee(americano, '카페모카');
console.log(mocha);
var latte = yield addCoffee(mocha, '카페모카');
console.log(latte);
};
var coffeeMaker = coffeeGenerator();
coffeeMaker.next();
var addCoffee = function (name) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(name);
}, 500);
});
};
var coffeeMaker = async function () {
var coffeeList = "";
var _addCoffee = async function (name) {
coffeeList += (coffeeList ? "," : "") + (await addCoffee(name));
};
await _addCoffee("에스프레소");
console.log(coffeeList);
await _addCoffee("아메리카노");
console.log(coffeeList);
await _addCoffee("카페모카");
console.log(coffeeList);
await _addCoffee("카페라떼");
console.log(coffeeList);
};
coffeeMaker();