kav*_*ita 27 javascript jquery settimeout
我有一个代码,需要在延迟说5000毫秒后执行.目前我使用的是setTimeout但它是异步的,我希望执行等待它的返回.我尝试过使用以下内容:
function pauseComp(ms)
{
var curr = new Date().getTime();
ms += curr;
while (curr < ms) {
curr = new Date().getTime();
}
}
Run Code Online (Sandbox Code Playgroud)
但我想延迟的代码是使用raphaeljs绘制一些对象,并且显示器根本不是平滑的.我正在尝试使用doTimeout插件.我只需要延迟一次,因为延迟和要延迟的代码都在循环中.我没有要求身份证,所以我没有使用它.例如:
for(i; i<5; i++){ $.doTimeout(5000,function(){
alert('hi'); return false;}, true);}
Run Code Online (Sandbox Code Playgroud)
这等待5秒钟,然后给出第一个Hi,然后连续循环迭代在第一个之后立即显示警报.我想要它做的是等待5秒再次提醒警报等待然后提供警报等等.
任何提示/建议表示赞赏!
Thi*_*obo 48
接受的答案的变化与这个一样好.
此外,我同意优选setTimeout和异步函数调用的注意事项,但有时例如,在构建测试时,您只需要一个同步等待命令...
function wait(ms) {
var start = Date.now(),
now = start;
while (now - start < ms) {
now = Date.now();
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想要它在几秒钟内,在while检查时将开始ms除以1000 ...
Lin*_*Lin 18
const syncWait = ms => {
const end = Date.now() + ms
while (Date.now() < end) continue
}
Run Code Online (Sandbox Code Playgroud)
用法:
console.log('one')
syncWait(5000)
console.log('two')
Run Code Online (Sandbox Code Playgroud)
const asyncWait = ms => new Promise(resolve => setTimeout(resolve, ms))
Run Code Online (Sandbox Code Playgroud)
用法:
(async () => {
console.log('one')
await asyncWait(5000)
console.log('two')
})()
Run Code Online (Sandbox Code Playgroud)
const delayedCall = (array, ms) =>
array.forEach((func, index) => setTimeout(func, index * ms))
Run Code Online (Sandbox Code Playgroud)
用法:
delayedCall([
() => console.log('one'),
() => console.log('two'),
() => console.log('three'),
], 5000)
Run Code Online (Sandbox Code Playgroud)
如果您想利用新的async / await语法,可以将set timeout转换为promise,然后等待它。
function wait(ms) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("Done waiting");
resolve(ms)
}, ms )
})
}
(async function Main() {
console.log("Starting...")
await wait(5000);
console.log("Ended!")
})();
Run Code Online (Sandbox Code Playgroud)
JavaScript是一种单线程语言.您无法组合setTimeout和同步处理.会发生什么,计时器将会失效,但JS引擎将等待处理结果,直到当前脚本完成.
如果你想要同步方法,只需直接调用方法!
如果要在setTimeout之后处理某些内容,请将其包含在内或从超时函数中调用它.
使用新的 Atomics API,您可以启动同步延迟而不会出现性能峰值:
const sleep = milliseconds => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds)
sleep(5000) // Sleep for 5 seconds
console.log("Executed after 5 seconds!")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
45435 次 |
| 最近记录: |