如何评估此if语句

时间:2014-01-16 04:18:18

标签: javascript node.js

var wait = function() {
   return setTimeout(function() {
      return 8;
   }, 1000);
}

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

console.log(foo());

打印23

我理解函数调用是异步的;但是,在wait()函数返回之前,如何评估if块?我试图实现的逻辑如何在javascript中成功表示?

4 个答案:

答案 0 :(得分:5)

  

我理解函数调用是异步的;

函数调用完全同步。

  

在wait()函数返回之前,如何评估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);
})

答案 1 :(得分:4)

  

“我理解函数调用是异步的”

不,函数调用是同步的。

当您致电foo()时,它(显然)执行此行:

if (wait() === 8) {

...调用wait()wait()函数立即返回setTimeout()返回的值,这是一个可以与clearTimeout()一起使用的超时ID。此超时ID可能不是8,因此else案例已完成。

setTimeout()不关心传递给它的函数的返回值,因此return 8“消失” - 没有用该值完成。

传递给setTimeout()的函数排队等待稍后执行:这将在指定的延迟(1000ms)之后或当前函数(以及任何调用它)完成后执行,以较晚者为准。

答案 2 :(得分:0)

如果您阅读Timeout explains

从这里开始,尝试timeout test,您将知道wait只是超时对象的id。您甚至可以在1秒内调用clearTimeout(wait)来清除超时对象。

答案 3 :(得分:0)

通常,setTimeout函数将返回一个与clearTimeout方法一起使用的整数。 http://msdn.microsoft.com/en-us/library/ie/ms536753(v=vs.85).aspx

wait()方法返回1,所以如果没有执行块。但是在1000 ms之后执行setTimeout函数。