如果此问题之前已经在这里问过,我很抱歉,我没有找到合适的答案。
我想创建一个JavaScript的睡眠/延迟/等待函数,我可以在脚本的任何地方调用它,就像jQuery的.delay()
一样。
由于我有一个通过php生成的脚本,所以我不能使用setTimeout,并将其放入两个不同的函数中,其中间有超时。我需要创建一个函数,允许我执行
alert("time started");
sleep(4000);
alert("time up");
我真的不想使用jQuery。
如果此问题之前已经在这里问过,我很抱歉,我没有找到合适的答案。
我想创建一个JavaScript的睡眠/延迟/等待函数,我可以在脚本的任何地方调用它,就像jQuery的.delay()
一样。
由于我有一个通过php生成的脚本,所以我不能使用setTimeout,并将其放入两个不同的函数中,其中间有超时。我需要创建一个函数,允许我执行
alert("time started");
sleep(4000);
alert("time up");
我真的不想使用jQuery。
这是一个使用新的async/await语法的解决方案。
async function testWait() {
alert('going to wait for 5 second');
await wait(5000);
alert('finally wait is over');
}
function wait(time) {
return new Promise(resolve => {
setTimeout(resolve, time);
});
}
注意:您只能在异步函数中调用wait函数。
resolve()
的函数,你可以直接用 resolve 函数本身替换它:将 () => { resolve(); }
替换为 resolve
。 - Coco Liliace很遗憾,您不能仅仅添加一个函数来暂停Javascript。
您必须使用 setTimeout()
函数。
示例:
function startTimer () {
timer.start();
setTimeout(stopTimer,5000);
}
function stopTimer () {
timer.stop();
}
编辑:
对于你自己生成的倒计时,它同样很简单。
HTML:
<input type="number" id="delay" min="1" max="5">
JS:
JS(JavaScript):var delayInSeconds = parseInt(delay.value);
var delayInMilliseconds = delayInSeconds*1000;
function startTimer () {
timer.start();
setTimeout(stopTimer,delayInMilliseconds);
}
function stopTimer () {
timer.stop;
}
现在你只需要为startTimer()
添加一个触发器,比如onchange
。
你需要使用setTimeout,所以我认为你的问题是:
我有一个由PHP生成的脚本,因此无法将其放入两个不同的函数中。
是什么阻止了您在脚本中生成两个函数?
function fizz() {
var a;
a = 'buzz';
// sleep x desired
a = 'complete';
}
可以重写为:
function foo() {
var a; // variable raised so shared across functions below
function bar() { // consider this to be start of fizz
a = 'buzz';
setTimeout(baz, x); // start wait
} // code split here for timeout break
function baz() { // after wait
a = 'complete';
} // end of fizz
bar(); // start it
}
你会注意到在调用 baz
时内部的 a
起始值为 buzz
,而在调用结束后,foo
内部的 a
将变为 "complete"
。
基本上,将所有内容都包装在一个函数中,将所有变量移到该包装函数中,以便包含的函数可以继承它们。然后,每当遇到 wait NUMBER seconds
,就要 echo
一下 setTimeout
,结束当前的函数并开始一个新的函数以继续之前的工作。
由于当前浏览器中JS的实现方式,无法精确按照您所指定的行为进行操作。抱歉。
理论上,您可以编写一个带有循环的函数,其中循环结束条件基于时间,但这将占用您的CPU,使浏览器无响应,并且是极其低效的设计。我甚至拒绝为此编写示例;)
更新:我的回答被评为-1(不公平),但我想提到在ES6中(尚未在浏览器中实现,也没有默认启用Node.js),将能够以同步方式编写异步代码。您需要使用promises和generators。
例如,在Node.js中使用harmony标志可以立即使用它,使用Q.spawn(),请参见此博客文章中的示例(最后一个示例)。
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
function exportar(page,miliseconds,totalpages)
{
if (page <= totalpages)
{
nextpage = page + 1;
console.log('fnExcelReport('+ page +'); nextpage = '+ nextpage + '; miliseconds = '+ miliseconds + '; totalpages = '+ totalpages );
fnExcelReport(page);
setTimeout(function(){
exportar(nextpage,miliseconds,totalpages);
},miliseconds);
};
}