2016-09-23 3 views
2

누군가이 코드를 머리에 쓰도록 나를 도울 수 있습니까? 나는이 코드에서 어떤 코드가 첫 번째로 실행될 것인가를 스스로 결정할 수 없다 :/분명히 이것은 항상 콘솔에 1을 프린트하도록 보장하지만, 왜 그런지는 알 수 없다. 또한 함께 선은 "orig_fn.bind.apply ..."나를 위해 매우 혼란 :/함수를 항상 비동기로 만듭니다.

function asyncify(fn) { 
    var orig_fn = fn, 
     intv = setTimeout(function(){ 
      intv = null; 
      if (fn) fn(); 
     }, 0) 
    ; 

    fn = null; 

    return function() { 
     // firing too quickly, before `intv` timer has fired to 
     // indicate async turn has passed? 
     if (intv) { 
      fn = orig_fn.bind.apply(
       orig_fn, 
       // add the wrapper's `this` to the `bind(..)` 
       // call parameters, as well as currying any 
       // passed in parameters 
       [this].concat([].slice.call(arguments)) 
      ); 
     } 
     // already async 
     else { 
      // invoke original function 
      orig_fn.apply(this, arguments); 
     } 
    }; 
} 

function result(data) { 
    console.log(a); 
} 

var a = 0; 

ajax("..pre-cached-url..", asyncify(result)); 
a++; 
+0

내가 [바인딩] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind), [적용] (HTTPS에 대한 설명서를 읽어 시작할 것이다 : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply),의 setTimeout (https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout) 등 –

+0

또한 디버거를 가져 와서 코드를 단계별로 실행하십시오. 그것이 "가장 먼저 실행될 코드"를 보는 가장 쉬운 방법입니다. –

+0

디버거는 비동기 호출을 조사하려고 할 때 비참하게 실패 할 것입니다. 그것은 할 수 있지만, 크롬 개발 도구를 사용하여 특정 숙달이 필요합니다. –

답변

1

이의 당신의 asyncify() 함수가 무엇인지 이해하자.

첫째로, 그것은 당신의 ajax() 호출의 두 번째 인수로 자사의 결과를 제공하기 위해, 즉시 호출되는 것을 알 수 있습니다. 익명의 함수를 반환합니다.

지금, 익명 함수가 호출 될 때에 따라 두 가지 중 하나 일이 : 그것은 즉시라고하면

1) setTimeout 아직 실행되지 않았고, 따라서 그것이 호출 된 인수를 가져, 귀하의 경우에는 원래 함수 asyncify()이 함께 호출되었으며, 이는 result입니다. 포장은 bind()을 사용하여 이루어집니다. 그런 다음 타임 아웃이 실제 호출을 처리하도록 종료합니다. 그것은 바로 새로운 매개 변수와 함께 원래의 함수를 호출 할 수 있도록이 호출이 즉시 호출되어 있지 않은 경우

2), 타임 아웃은, 이미 경과했다. 이 작업은 apply()을 사용하여 수행됩니다.

관련 문제