2014-01-16 103 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)来清除超时对象。