如何使一个NodeJs函数等待?

例如,我有这两个function:

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 abc 

但是我得到的是:

 1 2 3 abc -1 -2 -3 

为什么函数不等待超时结束? 我怎样才能达到预期的行为?

你没有得到1 2 3 -1 -2 -3 abc的原因是因为你的代码不会停在setTimeout(...)调用。 这是因为许多JavaScript方法本质上是asynchronous的 。 这意味着他们不会阻止你的代码stream。 这意味着当您调用setTimeout(...) ,JavaScript解释器将确保传入setTimeout的函数在2000 ms内运行,但不会停止并等待它。 它将继续正常的执行stream程,转到下一条指令。

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

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

为什么函数不等待超时结束?

因为这不是setTimeout工作方式。

实际发生的事情是,你要求你的函数运行不less于X毫秒(你的情况是2000)。 JS运行库将等待所有其他代码完成运行,然后查看它是否至less有X毫秒。 一旦有,你的function将运行。 但在此期间,您可以运行任何其他的JS代码。 它故意不阻止其他代码运行。

我怎样才能达到预期的行为?

最好的答案是不同的结构你的代码。 您需要学习如何使用asynchronous事件。 最简单的方法是使用callback函数:

 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 

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

Node.js用于asynchronous事件驱动的编程。 你根本不想被阻止执行 – 你所要求的行为根本不是“想要的”。

我build议你阅读关于Node.js和asynchronous编程,然后重新访问你实际上正在做什么。 你可能想要更像这样的东西:

 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);