如何使一个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);