2014-01-16 2 views
1
var wait = function() { 
    return setTimeout(function() { 
     return 8; 
    }, 1000); 
} 

var foo = function() { 
    if (wait() === 8) { 
     return 99; 
    } else { 
     return 23; 
    } 
} 

console.log(foo()); 

인쇄 (23)평가이 if 문은 어떻게

내가 함수 호출이 비동기 이해; 그러나 wait() 함수가 반환 될 때까지 if 블록을 평가할 수 있습니까? 달성하고자하는 논리를 자바 스크립트에서 어떻게 성공적으로 표현할 수 있을까요?

답변

5

저는 함수 호출이 비동기임을 이해합니다.

함수 호출은 완전히 동기식입니다.

if 블록은 wait() 함수가 반환 될 때까지 어떻게 평가할 수 있습니까?

대기 기능은 즉시 시간 초과 ID 인 setTimeout의 결과를 반환합니다. setTimeout에 전달한 함수는 언젠가 나중에 실행되고이 반환되며 반환 값은 손실됩니다.

달성하려는 로직은 어떻게 자바 스크립트에서 성공적으로 나타낼 수 있습니까?

가능성이있는 코드는 다음과 같습니다. 나는 수동으로

// `wait` takes a callback which is captured in it's closure to be used by 
// the anonymous function passed to setTimeout, sometime in the future. 
var wait = function(callback) { 
    return setTimeout(function() { 
     callback(8); 
    }, 1000); 
} 

// `foo` also takes a callback that will be called when the function passed 
// to `wait` is evaluated. 
var foo = function(callback) { 
    wait(function(value){ 
     if (value === 8) { 
      callback(99); 
     } else { 
      callback(23); 
     } 
    } 
} 

// Finally, `foo` is called with another callback, this time logging the value. 
foo(function(value) { 
    console.log(value); 
}) 
4

아니, 함수 호출 동기입니다 "나는 함수 호출이 비동기 적 이해".

if (wait() === 8) { 

... wait()를 호출하면 foo()를 호출 할 때

, 그것은 (명백하게)이 줄을 실행합니다. wait() 함수 즉시clearTimeout()과 함께 사용할 수있는 시간 초과 ID 인 setTimeout()에 의해 반환 된 값을 반환합니다. 이 시간 초과 ID는 8 일 가능성이 없으므로 else 경우가 수행됩니다.

setTimeout()은 전달한 함수의 반환 값에 상관하지 않으므로 return 8은 "사라집니다"- 아무 것도 그 값으로 수행되지 않습니다.

setTimeout()에 전달하는 함수는 나중에 실행되도록 대기열에 있습니다. 이것은 지정된 지연 (1000ms) 이후 또는 현재 함수 (및 호출 된 모든 것)가 실행을 마친 후에 발생합니다.

0

여기에서 Timeout explains

을 읽으면 Continuation Passing Style에 코드를 변환하고 wait이 타임 아웃 객체의 ID입니다 것을 알 수 timeout test 시도했다. 여전히 1 초 안에 clearTimeout(wait)을 호출하여 시간 초과 객체를 지울 수도 있습니다.

관련 문제