-
Notifications
You must be signed in to change notification settings - Fork 3.3k
第 42 题:实现一个 sleep 函数,比如 sleep(1000) 意味着等待1000毫秒,可从 Promise、Generator、Async/Await 等角度实现 #63
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
const sleep = (time) => {
return new Promise(resolve => setTimeout(resolve, time))
}
async function sleepAsync() {
console.log('fuck the code')
await sleep(1000)
console.log('fuck the code again')
}
sleepAsync() |
4种方式: //Promise
const sleep = time => {
return new Promise(resolve => setTimeout(resolve,time))
}
sleep(1000).then(()=>{
console.log(1)
})
//Generator
function* sleepGenerator(time) {
yield new Promise(function(resolve,reject){
setTimeout(resolve,time);
})
}
sleepGenerator(1000).next().value.then(()=>{console.log(1)})
//async
function sleep(time) {
return new Promise(resolve => setTimeout(resolve,time))
}
async function output() {
let out = await sleep(1000);
console.log(1);
return out;
}
output();
//ES5
function sleep(callback,time) {
if(typeof callback === 'function')
setTimeout(callback,time)
}
function output(){
console.log(1);
}
sleep(output,1000); 参考: |
const sleep = (time) => {
return new Promise((resolve, reject) => {
setTimeout(resolve, time);
});
};
sleep(1000).then(() => {
console.log('sleep end');
}); 大家在工作中是使用Promise最多吗 |
|
|
|
// 方法一 function sleep(time) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(time)
}, time)
})
}
sleep(5000).then((time) => { console.log(`你睡了${time / 1000}s,然后做你的事情`) }) // 方法二 function async sleep2(time) {
await sleep(time)
// then do you thing
console.log(`你睡了${time / 1000}s,然后做你的事情`)
// async 函数返回的是一个promise对象
} // 方法三 function* sleep3(time) {
yield new Promise(resolve => {
setTimeout(resolve, time)
})
}
sleep3(5000).next().value.then(() => { console.log("睡了一会儿,然后做你做的事情")}) // 方法四 function sleep4(func, time) {
setTimeout(func, time)
} |
难道就不能不用定时器吗 function sleep (time) {
var now = +Date.now()
while (+Date.now() - now <= time) {}
return
}
console.time(1)
sleep(2000)
console.log(123)
console.timeEnd(1)
console.time(1)
sleep(3000)
console.log(456)
console.timeEnd(1)
// 123
// 2000.244140625ms
// 456
// 3001.861328125ms |
在9012年的今天,其他都是异端,请使用async/await。 |
//1. Promise
const sleep1 = time => new Promise(resolve => setTimeout(resolve, time));
//2.without Promise
const sleep2 = time => ({
then: cb => {
setTimeout(cb, time);
}
});
//3. Generator, without Promise code
const sleep3 = time => {
function* gen() {
yield {
then: cb => {
setTimeout(cb, time);
}
};
}
return gen().next().value;
};
//4. async/await without Promise code and Generator
const sleep4 = async time=>{
await sleep2(time);
}
//call
(async ()=>{
console.time('sleep1');
await sleep1(1000);
console.timeEnd('sleep1');
console.time('sleep2');
await sleep2(1000);
console.timeEnd('sleep2');
console.time('sleep3');
await sleep3(1000);
console.timeEnd('sleep3');
console.time('sleep4');
await sleep4(1000);
console.timeEnd('sleep4');
})();
//typeof callback === "hell" |
function timeout (time) {
return new Promise(function(res,rej){
setTimeout(res,time)
})
}
async function sleep (time) {
console.log(1)
await timeout(time)
console.log(2)
} |
|
看题目以为是实现类似于java的sleep sleep(1000);
console.log('sleep之后做的事'); 后来实在想不出来怎么实现,看了大家的答案,发现是我想多了,,确实没法实现这样的sleep |
|
其实都是 promise |
function sleep(wait) {
let date = new Date().getTime();
console.log('wait...')
while ((new Date().getTime()) - date < wait) {
continue;
}
} |
sleep实现无外乎同步和异步两种方法。同步可以用for循环或者while让它在等待时间内啥也不干;异步就是利用setTimeout来做定时。如果后序处理很复杂,可以考虑结合promise来实现。毕竟,promise解决回调地狱之类的问题还是很有一套的。代码就不贴了,上面都是。免得搞一大片的重复代码,实在没啥必要。 |
你这人真极端,文革期间应该是抛头颅洒热血的好青年。。。 |
|
|
promise方法 function sleep(time) {
return new Promise(resolve => {
setTimeout(() => {
resolve()
}, time)
})
}
sleep(1000).then((data) => {
// do something
}) async/await方法 async function sleep(time) {
await new Promise(resolve => {
setTimeout(resolve, time)
})
// do something
...
} generator function * sleep (time) {
yield new Promise(resolve => {setTimeout(resolve, time)})
}
sleep(1000).next().value.then(() => {
console.log('已经等待1s')
}) |
const sleep = n => Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, n * 1000) |
promise: ` ` |
什么是sleep? 什么实现用Promise 或是 async await的方法和setTimeout有本质上的区别吗? sleep不应该用代码的方式 阻塞住进程,让他啥也干不了吗? function sleep(time){
let currentTime=Date.now();
while(Date.now()-currentTime<=time){
}
return;
}
console.log("aaa")
sleep(5000);
console.log("bbb") |
用while一直循环,直到时间到退出循环那个是真sleep啊 |
我为什么不直接settimeout呢,还要包一下 |
或
|
这种方式会阻塞代码的 |
// Promise // generator
// async await
|
setTimeout: function con() {
console.log(1);
}
function sleepForSettimeout(fn, delay) {
setTimeout(() => {
fn();
}, delay);
}
sleepForSettimeout(con, 1000); Promise: function sleepForPromise(delay) {
return new Promise(res => setTimeout(res, delay));
}
sleepForPromise(1000).then(con); Generator: function* sleepForGenerator(fn, delay) {
yield setTimeout(() => {
fn();
}, delay);
}
var g = sleepForGenerator(con, 1000);
g.next(); Async/Await: async function sleepForAsyncAwait(fn,delay) {
await new Promise(res => setTimeout(res, delay));
fn();
}
sleepForAsyncAwait(con ,1000); |
是啊,这题出的就有问题,直接setTimeout不好嘛,为啥还要加这么多花里胡哨的 |
// Promise
function sleep1(time) {
return new Promise(resolve => {
setTimeout(() => {
resolve();
}, time);
})
}
sleep1(1000).then(() => console.log("sleep1"));
// Generator
function* sleep2(time) {
return yield sleep1(time);
}
const s = sleep2(1500);
s.next().value.then(() => console.log("sleep2"));
// Async/Await
async function sleep3(time) {
await sleep1(time);
}
(async () => {
await sleep3(2000);
console.log("sleep3")
})() |
function sleep(ms) {
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve();
}, ms)
})
}
// promise
sleep(1000).then(()=>{
console.log('1000ms after');
})
// async / await
async function main() {
await sleep(1000);
console.log('1000ms after');
}
// generator
function* main() {
yield sleep(1000);
}
main().next().value.then(()=>{
console.log('1000ms after');
})
// generator co
function co (generator) {
const gen = generator();
function cb (param) {
let tmp = gen.next(param);
if (tmp.done) return Promise.resolve(tmp.value);
tmp.value.then((ret)=>{
cb(ret)
});
}
cb();
}
function* main() {
yield sleep(1000);
console.log('1000ms after');
yield sleep(1000);
console.log('2000ms after');
}
co(main); |
这道题其实就是异步逻辑同步化 // 回调
const sleep = (time, cb) => setTimeout(cb, time)
sleep(1000, () => console.log('开始搞事情~'))
// Promise
const sleep = (time) => {
return new Promise((re, rj) => {
setTimeout(re, time)
})
}
sleep(1000).then(() => console.log('开始搞事情~'))
// Generator
const gen = function* (time) {
console.log('开始搞事情~')
}
const sleep = (gen, time) => {
let g = gen()
setTimeout(() => g.next(), time)
}
sleep(gen, 1000)
// async/await
const sleep= async (time) => {
await new Promise((re, rj) => {
setTimeout(re, time)
})
console.log('开始搞事情~')
}
sleep(1000).then(() => console.log('或者这样搞事情~')) |
function sleep(interval) {
return new Promise((resolve, reject) => {
let timer
const now = Date.now
let startTime = now()
let endTime = startTime
const loop = () => {
timer = window.requestAnimationFrame(loop)
endTime = now()
if (endTime - startTime >= interval) {
window.cancelAnimationFrame(timer)
resolve()
}
}
timer = window.requestAnimationFrame(loop)
})
}
sleep(2000).then(() => {
// ...
console.log('hello world!')
}) 可能会比setTimeout精确一点点 |
感觉是无法实现sleep。只能用while实现假的sleep |
const sleep = delay => new Promise(resolve => setTimeout(resolve, delay)); |
从语言设计上来说JS有了异步模型也就不需要Java 的那种sleep函数了。Java里面可以多线程并发,某一个线程可以sleep,这时会让出cpu资源;JS里面可以使用循环模拟sleep,但是sleep时间如果过长,cpu会一直占用着,造成卡死;另,setTimeout+promise系列还是属于异步逻辑,只是一层层的套壳。 |
pdd刚面试完个promise实现sleep,不能用async/await关键字 |
前几个方法都很棒,就这个ES5的咋感觉就是用setTimout实现了个setTimeout😂 |
异步具有传染性,sleep加上之后,使用的每个方法都要用async,或者then |
已收到!
|
看到一篇文章分享一下 https://jasonformat.com/javascript-sleep/ |
已收到!
|
The text was updated successfully, but these errors were encountered: