如何使NodeJs函数等待?

时间:2016-06-27 20:48:43

标签: javascript node.js timeout wait

例如,我有这两个功能:

var count= function(){
    for(i=1;i<=3;i++){
        console.log(i);
    }
    setTimeout(function(){
        for(i=1;i<=3;i++){
            console.log(-i);
         }
    },2000);
} 

var letters = function(){
     var charSet = 'abcdefghijklmnopqrstuvvwxyz'
     for(i=0;i<3;i++){
         console.log(charSet[i]);
     }
}

当我按此顺序执行时:

count();
letters();

我希望得到输出:

1 2 3 -1 -2 -3 a b c

但我得到的是:

1 2 3 a b c -1 -2 -3

为什么函数不等待Timeout完成?我怎样才能达到预期的行为?

3 个答案:

答案 0 :(得分:2)

您未获得1 2 3 -1 -2 -3 a b c的原因是因为您的代码未在setTimeout(...)来电停止。这是因为许多JavaScript方法本质上都是asynchronous。这意味着它们不会阻止代码的流动。这意味着当您调用setTimeout(...)时,JavaScript解释器将确保传递到setTimeout的函数在2000 ms内运行,但不会停止并等待它。它将继续正常的执行流程,进入下一条指令。

如果您希望等待,可以在打印剩余数字(letters())后进行-1, -2, -3来电。

    setTimeout(function(){
        for(i=1;i<=3;i++){
            console.log(-i);
         }
         letters();
    },2000);

答案 1 :(得分:2)

  

为什么函数不等待Timeout完成?

因为那不是setTimeout的工作方式。

实际发生的事情是你提出让你的函数运行不少于X毫秒(在你的情况下是2000)的请求。 JS运行时将等待所有其他代码完成运行,然后查看它是否至少为X毫秒。一旦有,你的功能就会运行。但与此同时,您可以运行任何其他JS代码。它故意不阻止其他代码运行。

  

如何实现理想的行为?

最好的答案是以不同方式构建代码。您需要学习使用异步事件。最简单的方法是使用回调函数:

var count = function(cb) {
  for (i = 1; i <= 3; i++) {
    console.log(i);
  }
  setTimeout(function() {
    for (i = 1; i <= 3; i++) {
      console.log(-i);
    }
    
    // Run the function we passed to it after the rest is done
    cb();
  }, 2000);
}

var letters = function() {
  var charSet = 'abcdefghijklmnopqrstuvvwxyz'
  for (i = 0; i < 3; i++) {
    console.log(charSet[i]);
  }
}

count(letters); // Pass `letters` as a callback so it will be called after `count` is done

答案 2 :(得分:1)

因为setTimeout安排第二个循环稍后运行(在~2秒内),然后立即返回。

Node.js用于异步,事件驱动的编程。您根本不想阻止执行 - 您要求的行为不是&#34;期望&#34;一点都不。

我建议您阅读有关Node.js和异步编程的内容,然后重新访问您实际尝试的内容。你可能想要更像这样的东西:

function count(callback) {
    for (i=1; i<=3; i++){
        console.log(i);
    }
    setTimeout(function() {
        for(i=1;i<=3;i++){
            console.log(-i);
        }
        callback();
    }, 2000);
} 

function letters() {
     var charSet = 'abcdefghijklmnopqrstuvvwxyz'
     for (i=0; i<3; i++){
         console.log(charSet[i]);
     }
}

然后运行它:

count(letters);