TIL 55 day第4章コールバック関数
4734 ワード
Callback Function他のコードパラメータに渡される関数 制御権に関連
コールバック関数とは
制御権をパラメータとして他のコード(関数またはメソッド)の関数に渡します.
setInterval(cbFunc, 300); => 呼び出しボディ:setInterval、制御権:setIntervalコールバック関数の制御権を受けるコードは、コールバック関数の呼び出し時点に対する制御権を有する. this call/applyメソッド=>thisArg値がある場合は、その値、またはグローバルオブジェクト を指定します.
コールバック関数は関数ですコールバック関数は、メソッドではなく を呼び出す.コールバック関数の位置にメソッドが追加されましたが、通常の関数として呼び出され、グローバルオブジェクトを観察しています. コールバック関数でこのアイテムをバインド
変数に割り当てる方法従来の方法では、 を使用して変数に割り当てる.オブジェクトにおける関数の回収方法
変数を割り当て、変数を指定します.
bindメソッドの使い方 bindメソッドを使用して を直接指定
コールバック地獄と非同期制御コールバック地獄(callback hell):コールバック関数を匿名関数に渡すプロセスを繰り返し、コードのインデント深さに耐えられない 非同期:同期の反意語、非同期コードは、現在実行中のコードが完了しているかどうかにかかわらず、以下のコードを実行します. 同期:同期コードは現在実行中のコードが完了した後に以下のコードを実行し、ほとんどの即時処理可能なコードは同期の である.要求、実行待ち、保留等に関するコードは非同期 である.
1)非同期タスクの同期表示Promise 3行目のエンクロージャ(変数prevNameとnameを使用) 2)非同期タスクの同期表示ジェネレータ発電機を使用すると、nextの方法を有する奇形器が返されます. nextメソッドを呼び出すと、Generator関数で最初に現れる降伏停止関数が 実行する.以降にnextメソッドが再び呼び出されると、以前に停止する部分から、次いで完成品において が停止する.
非同期タスクの同期表示Promis+Async/awaitの非同期動作を必要とする関数の前にasyncタグ を付ける関数で実質的な非同期操作が必要な場合は、必要な位置ごとにタグを待機し、その後の内容は自動電話 を承諾するものとする.この問題を解決した後、 を継続する.
コールバック関数とは
制御権をパラメータとして他のコード(関数またはメソッド)の関数に渡します.
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の再使用方法は、変数を割り当てることによって使用されます.変数を割り当て、変数を指定します.
bindメソッドの使い方
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
コールバック地獄と非同期制御
1)非同期タスクの同期表示Promise
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();
非同期タスクの同期表示Promis+Async/await
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();
Reference
この問題について(TIL 55 day第4章コールバック関数), 我々は、より多くの情報をここで見つけました https://velog.io/@winney_77/TIL-55-day-4장-콜백함수テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol