2017-01-09 7 views
1

私は現在「You Do not Know Javascript」を読んでいて、決して実行していないコールバックに対処する方法の例で問題を見つけました。呼び出されなかったコールバックのアドレス指定?非同期Javascript

下記の例では、どのように動作するのかわかりません。

エラーがあるかどうか、またはデータが有効であれば、timeoutify(foo、500)でajaxリクエストが呼び出されます。

timeoutifyを実行すると、fooと500がパラメータとして使用され、最初のsetTimeout関数が実行され、500ミリ秒でsetTimeoutがクリアされないとタイムアウトエラーが発生します。

しかし、if(intv)部分で始まる後半部分で問題があります。 setTimeoutが最初に実行されているので、常にif(intv)をtrueに設定すると、文は常に後半に戻ります。エラーのタイムアウトはいつ起きますか?ここで

function timeoutify(fn,delay) { 
    var intv = setTimeout(function(){ 
       intv = null; 
       fn(new Error("Timeout!")); 
      }, delay); 
    return function() { 
    // timeout hasn't happened yet? 
    if (intv) { 
     clearTimeout(intv); 
     fn.apply(this, arguments); 
    } 
    }; 
} 

前のコードです:

// using "error-first style" callback design 

    function foo(err,data) { 
     if (err) { 
     console.error(err); 
     } else { 
     console.log(data); } 
     } 
     ajax("http://some.url.1", timeoutify(foo, 500)); 

答えて

1

はsetTimeoutを最初

intvを実行しているので(INTV)がtrueに設定されている場合、取得常にtimeoutifyませんsetTimeoutに渡された関数によってtrueに設定され、delayで指定された時間が経過するまでその関数が呼び出されません。

+0

私はまだ少し混乱しています。一度それが実行されると、setTimeoutの内部の関数。それはintvをtrueに設定しますか?私はそれが500秒後にintv = nullを設定すると思った。リターンの半分はいつこのキューの間にアクティブになる機会を得ますか?私は、これらの出来事が起こっている順序が間違いないと主張しています。誰かがもう少し明確にすることができますか? – Stev

+0

500msではなく500msです。返される関数が呼び出されるまでの時間は500msです。 – Quentin

関連する問題