Przeglądaj źródła

HWJS14 (await, speedtest,trafficLight) done

DimaBondarenko 3 lat temu
rodzic
commit
771f99529d

Plik diff jest za duży
+ 2 - 0
HWJS14/css/style.min.css


Plik diff jest za duży
+ 9 - 0
HWJS14/css/style.min.css.map


+ 24 - 0
HWJS14/index.html

@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+    <link rel="stylesheet" href="css/style.min.css">
+</head>
+<body>
+    <div class="carTrafficLight">
+        <div class="light light-red " ></div>
+        <div class="light light-yellow"></div>
+        <div class="light light-green"></div>
+    </div>
+    <div class="pedestrianTrafficLight">
+        <div class="light light-red"></div>
+        <div></div>
+        <div class="light light-green"></div>
+    </div>
+    <button class="btnTurnOn">ты кнопка</button>
+    <script src="js/script.js"></script>
+</body>
+</html>

+ 106 - 0
HWJS14/js/script.js

@@ -0,0 +1,106 @@
+///Async/Await Homework 2
+let carTrafficLight = document.querySelector('.carTrafficLight');
+let pedestrianTrafficLight = document.querySelector('.pedestrianTrafficLight');
+let lightsForCars = carTrafficLight.querySelectorAll('.light');
+let lightsForPedestrians = pedestrianTrafficLight.querySelectorAll('div');
+let btnTurnOn = document.querySelector('.btnTurnOn');
+let currentParent = []
+
+const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
+
+function domEventPromise(elem, eventName){
+    return new Promise((resolve) => {
+        let funcResolve = function(){
+            resolve(cleanParent);
+            elem.removeEventListener(eventName, funcResolve);
+        }
+        elem.addEventListener(eventName, funcResolve);
+    })
+}
+
+function cleanParent(number){
+    currentParent[number].innerHTML = '';
+}
+
+async function counter(startms, finishms, parent, number){
+    currentParent[number] = parent
+    let span = document.createElement('span');
+    parent.append(span);
+
+    for(let i = startms/1000; i>=finishms/1000; i--){
+        span.innerHTML = i
+        await delay(1000)
+    }
+    return cleanParent
+}
+
+function light(elem, color){
+    for (let e of elem){
+        e.style.backgroundColor = ''
+    }
+    if (color === 'red'){
+        elem[0].style.backgroundColor = color
+    } else if(color === 'yellow'){
+        elem[1].style.backgroundColor = color
+    } else if(color === 'green'){                      // у trafficLightForPedestrians тоже три div просто желтый невидим,поэтому зеленый [2] 
+        elem[2].style.backgroundColor = color   
+    }
+}
+
+
+async function trafficLightForPedestrians(){
+    while(true){
+        light(lightsForPedestrians,'red');
+        await counter(25000, 17000,lightsForPedestrians[0],1).then(func => func(1));            //// задержка чтобы не наглели (c 16 cek)
+        await Promise.race([counter(16000, 1000,lightsForPedestrians[0],1), domEventPromise(btnTurnOn, "click")]).then(func => func(1));
+        light(lightsForPedestrians,'green');
+        await counter(10000, 1000,lightsForPedestrians[2],1).then(func => func(1)); //func(1) или func(2) обнуление счетчика(из массива currentParent)
+    }
+    
+}
+async function trafficLightForCars(){
+    while(true){
+        light(lightsForCars,'yellow');
+        await counter(3000, 1000,lightsForCars[1],0).then(func => func(0));
+        light(lightsForCars,'green');
+        await counter(22000, 17000,lightsForCars[2],0).then(func => func(0));  ///задержка чтобы не наглели на (c 16 cek)
+        await Promise.race([counter(16000, 1000,lightsForCars[2],0),domEventPromise(btnTurnOn, "click")]).then(func => func(0));
+        light(lightsForCars,'red');
+        await counter(10000, 1000,lightsForCars[0],0).then(func => func(0));
+    }
+}
+
+trafficLightForPedestrians()
+trafficLightForCars();
+
+//////////////////////////////////speedTest
+async function speedTest(getPromise, count, parallel=1){
+   
+    let createPromiseArr = function (){
+        let arrPromise = []
+        for (let i = 0; i<parallel; i++){
+            arrPromise.push(getPromise())
+        }
+        return arrPromise
+    }
+    let startDuration = performance.now();
+    for (let i = 0; i < count; i++){
+        await Promise.all(createPromiseArr())
+    }
+    let endDuration = performance.now();
+
+    let duration = endDuration - startDuration;
+    let querySpeed = count /duration;
+    let queryDuration = duration / count;
+    let parallelSpeed = count * parallel / duration;
+    let parallelDuration = duration / (count * parallel);
+    return {
+        duration,                  
+        querySpeed,               
+        queryDuration, 
+        parallelSpeed,
+        parallelDuration
+    }
+}
+
+speedTest(() => delay(1000), 10, 10 ).then(result => console.log(result));

+ 77 - 0
HWJS14/sass/style.scss

@@ -0,0 +1,77 @@
+*{
+    box-sizing: border-box;
+    margin: 0;
+}
+body{
+    padding: 50px;
+    display: flex;
+    justify-content: center;
+}
+
+.carTrafficLight{
+    width: 100px;
+    height: 250px;
+    background-color: darkcyan;
+    margin: 0 auto;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+    align-items: center;
+    div{
+        width: 70px;
+        height: 70px;
+        border-radius: 50%;
+        border: 2px solid black;
+        text-align: center;
+        padding: 14px;
+    }
+    .light-red{
+        background-color: red;
+        
+    }
+    .light-yellow{
+        background-color: yellow;
+    }
+    .light-green{
+        background-color: green;
+    }
+    .light{
+        background-color: darkcyan;
+    }
+}
+
+.pedestrianTrafficLight{
+    width: 100px;
+    height: 180px;
+    background-color: darkcyan;
+    margin: 0 auto;
+    display: flex;
+    flex-direction: column;
+    justify-content: space-around;
+    align-items: center;
+    .light-red{
+        background-color: red;
+        
+    }
+    .light-green{
+        background-color: green;
+    }
+    .light{
+        background-color: darkcyan;
+        width: 70px;
+        height: 70px;
+        border-radius: 50%;
+        border: 2px solid black;
+        text-align: center;
+        padding: 14px;
+    }
+}
+
+.btnTurnOn{
+    width: 100px;
+    height: 30px
+}
+
+span{
+    font-size: 30px;
+}