在服务器端,您可以使用
deasyncsleep()
方法,该方法是在
C中本地实现的,因此它可以有效地实现
等待效果,而不会阻塞
事件循环或使CPU负载达到100%。
例如:
#!/usr/bin/env node
// Requires `npm install --save deasync`
var sleep = require("deasync").sleep;
sleep(5000);
console.log ("Hello World!!");
但是,如果您需要一个 纯 JavaScript 函数(例如,在浏览器端运行它),我很抱歉地说,我认为您的 pausecomp()
函数是唯一的方法,而且更重要的是:
它不仅暂停了您的函数,还暂停了整个事件循环。因此,没有其他事件会被处理。
它使您的 CPU 负载达到 100%。
因此,如果您需要在浏览器脚本中使用它,并且不想出现这些可怕的影响,我必须告诉您应该重新考虑一下您的函数:
a). 您可以在超时后重新调用它(或调用一个 do_the_rest()
函数)。如果您不期望从函数中得到任何结果,则这是最简单的方法。
b). 或者,如果您需要等待结果,那么您应该转而使用 promises(或回调地狱,当然 ;-))。
不需要结果的示例:
function myFunc() {
console.log ("Do some things");
setTimeout(function doTheRest(){
console.log ("Do more things...");
}, 5000);
};
myFunc();
一个返回 Promise 的示例(注意它会改变你的函数用法):
function myFunc(someString) {
return new Promise(function(resolve, reject) {
var result = [someString];
result.push("Do some things");
setTimeout(function(){
result.push("Do more things...");
resolve(result.join("\n"));
}, 5000);
});
};
myFunc("Hello!!").then(function(data){
console.log(data);
}).catch(function(err){
console.error(err);
});
sleep()
来计时动画。(我知道有更好的方法...)提问者提供的代码在 Chrome 中对我无效,因为浏览器不会在脚本中进行修改后立即更新 DOM,而是等待代码执行完成后再进行任何 DOM 更新,因此脚本会等待所有延迟的总和,然后一次性应用所有 DOM 更新。 - Ari Fordsham