1. функция сна
JavaScript работает в одном потоке и не имеет встроенной функции сна, а теперь имитирует эффект отложенного выполнения сна.
Используйте функцию сна для реализации кода светофора: красный свет — 2 секунды, желтый свет — 1 секунда, зеленый свет — 3 секунды, а цвет меняется циклически.
2. setTimeout
Реализовать напрямую с помощью setTimeoutsleep()
У метода лучшая совместимость, но используется реализация callback-функции, а читабельность и ремонтопригодность кода не очень.
// setTimeout
let fun = () => console.log('time out');
let sleep = function(fun,time){
setTimeout(()=>{
fun();
},time);
}
sleep(fun,2000);
setTimeout
setTimeout
Это самая простая реализация.Код выглядит следующим образом, используя рекурсию для циклического изменения цвета:
function changeColor(color) {
console.log('traffic-light ', color);
}
function main() {
changeColor('red');
setTimeout(()=>{
changeColor('yellow');
setTimeout(() => {
changeColor('green');
setTimeout(main, 2000);
}, 1000);
}, 2000);
}
main();
3.Promise
В синтаксисе ES6Promise
даsleep
Способ реализации асинхронных методов с помощьюPromise
Методы могут быть построены элегантноsleep
Метод реализации избегает использования обратных вызовов функций.
// promise
let fun = () => console.log('time out');
let sleep2= (time)=> new Promise((resolve)=>{
setTimeout(resolve,time)
})
sleep2(2000).then(fun);
Promise
Используйте Promise, затем запишите следующее изменение цвета и, наконец, используйте рекурсию для завершения цикла. Используйте обещание вместо setTimeout, используйте цепные вызовы, а затем, чтобы реализовать преобразование источников света, затем возвращает объект обещания, когда объект находится в состоянии разрешения, тогда его можно продолжать вызывать.
const traffic_light=(color,duration)=>{
return new Promise((resolve,reject)=>{
console.log('traffic-light ', color);
setTimeout(()=>{
resolve()
},duration)
})
}
const main=()=>{
Promise.resolve()
.then(()=>{
return traffic_light('red',3000)
})
.then(()=>{
return traffic_light('yellow',1000)
})
.then(()=>{
return traffic_light('green',2000)
})
.then(()=>{
main();
})
}
main()
4. async await
async await
на самом деле гenerator
а такжеpromise
синтаксический сахар на основе предоставления метода синхронного программирования для реализации асинхронных вызовов,sleep
Также широко используется семантическая поддержка функций.sleep
способ реализации.
// async await
async function wait(time){
await sleep2(time);
fun();
}
wait(3000);
async await
использовать
Использование async await может избежать серии .then.then.then Promise и больше не требует рекурсии, используйтеwhile(true)
цикл может быть достигнут.
function sleep(duration) {
return new Promise(resolve => {
setTimeout(resolve, duration);
})
}
async function changeColor(color, duration) {
console.log('traffic-light ', color);
await sleep(duration);
}
async function main() {
while (true) {
await changeColor('red', 2000);
await changeColor('yellow', 1000);
await changeColor('green', 3000);
}
}
main();
5. Выход 1 через 1 с, выход 2 через 2 с, выход 3 через 3 с
const log = console.log;
const sleep = (timeout) => {
return new Promise((resolve)=>{
setTimeout(()=>{
resolve();
}, timeout)
})
}
const main = async()=>{
await sleep(1000);
log(1);
await sleep(2000);
log(2);
await sleep(3000);
log(3);
}