2014-01-16 141 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語句

我理解函數調用是異步的;然而,如何評估if塊直到wait()函數返回?我試圖實現的邏輯如何在javascript中成功表示?

回答

5

我明白函數調用是異步的;

函數調用是完全同步的。

if()函數如何等待wait()函數返回?

您的等待函數會立即返回setTimeout的結果,即Timeout ID。您傳遞給setTimeout的函數將在將來的某個時間執行,並且返回值將丟失。

我試圖實現的邏輯如何在javascript中成功表示?

您可能正在尋找的代碼是這樣的。我已經手動轉換你的代碼Continuation Passing Style

// `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

「我理解函數調用是異步的」

沒有,函數調用是同步的。

當你調用foo(),它(顯然)執行這一行:

if (wait() === 8) { 

...這就要求wait()wait()函數立即返回setTimeout()返回的值,該值是一個可用於clearTimeout()的超時ID。此超時ID不太可能是8,因此else大小寫完成。

setTimeout()不關心你傳遞給它的函數的返回值,所以return 8「消失」 - 這個值沒有做任何事情。

您傳遞給setTimeout()的函數將排隊等待稍後執行:這將在指定的延遲(1000ms)之後或當前函數(以及調用它的任何函數)完成執行後發生,以較晚者爲準。

0

如果你讀Timeout explains

從這裏

,並嘗試timeout test你就知道wait只是超時對象的ID。當您仍然在1秒內時,您甚至可以通過調用clearTimeout(wait)來清除超時對象。