나는 썽크를 이해하려고 노력하고 있습니다. Lynda에 대한 Kyle Simpson의 Rethinking Async JS 과정을 살펴 보겠습니다.
이 코드가 있습니다.
function makeThunk(fn) {
var args = [].slice.call(arguments, 1);
return function(cb) {
args.push(cb);
fn.apply(null, args);
}
}
function addAsync(x,y, cb) {
setTimeout(function() {
cb(x+y);
}, 1000);
}
var thunk = makeThunk(addAsync, 10,15);
이제 다음을 실행할 때 :
thunk(function(sum) {
console.log(sum * sum);
})
thunk(function(sum) {
console.log(sum);
})
결과는 625 두 번 인쇄됩니다.
그러나 내가 실행할 때
thunk(function(sum) {
console.log(sum);
})
thunk(function(sum) {
console.log(sum * sum);
})
결과는 두 번 실행됩니다.
첫 번째 경우에는 625가 인쇄되고 25는 인쇄됩니다. 두 번째 경우에는 25가 인쇄되고 625가 인쇄됩니다.
내 기대가 잘못된 이유는 무엇입니까?
var thunk = makeThunk(addAsync, 10,15);
그 후 닫힌 args 배열은 다음과 같습니다.
[10, 15]
이제 thunk 를 호출하면 :
thunk(function one(sum) {
console.log(sum * sum);
})
내부 인수는 다음과 같습니다.
[10, 15, one]
그리고 함수는 처음으로 실행됩니다. 그런 다음 전화하십시오.
thunk(function two(sum) {
console.log(sum);
})
따라서 args는 다음과 같습니다.
[10, 15, one, two]
따라서 addAsync 는 다음과 같이 호출됩니다.
addAsync(10, 15, one, two)
따라서 cb 는 다시 하나 이므로 첫 번째 함수가 두 번 실행됩니다.
이 문제를 해결하려면 변경되지 않는 연결로 푸시를 통해 수정을 변경할 수 있습니다.
return function(cb) {
fn.apply(null, args.concat(cb));
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다