Browse Source

async_await_trafficLight

Iryna Bolbat 2 years ago
parent
commit
50805354e6

+ 28 - 0
js_13_async_await_trafficLight/index.html

@@ -0,0 +1,28 @@
+<!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">
+    <link rel="stylesheet" href="style.css">
+    <title>Document</title>
+</head>
+<body>
+    <div>
+        <div class="container">
+            <div id="red" class="circleRed"></div>
+            <div id="yellow" class="circleYellow"></div>
+            <div id="green" class="circleGreen"></div>
+        </div>
+    
+        <button id="knopka">knopka</button>
+    
+        <div class="container2">
+            <div id="red2" class="circleRed"></div>
+            <div id="green2" class="circleGreen"></div>
+        </div>
+    </div>
+    
+    <script src="main.js"></script>
+</body>
+</html>

+ 90 - 0
js_13_async_await_trafficLight/main.js

@@ -0,0 +1,90 @@
+const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms));
+
+async function trafficLight(timeRed, timeYellow, timeGreen){
+    while (true){
+        green.classList.remove('active');
+        red.classList.add('active');
+        await delay(timeRed);
+
+        red.classList.remove('active');
+        yellow.classList.add('active');
+        await delay(timeYellow);
+
+        yellow.classList.remove('active');
+        green.classList.add('active');
+        await delay(timeGreen);
+    }
+}
+trafficLight(3000, 1000, 3000);
+
+function domEventPromise(element, eventName) {
+    return new Promise(function(resolve, reject) {
+        element.addEventListener(eventName, (e) => resolve(e.target));
+        
+        element.removeEventListener(eventName, (e) => resolve(e.target));
+    });
+}
+
+// domEventPromise(knopka, 'click')
+//     .then( e => console.log('event click happens', e));
+
+//для пешеходов
+async function PedestrianTrafficLight(timeGreen, timeRed){
+    while (true){
+        red2.classList.remove('active');
+        green2.classList.add('active');
+        await delay(timeGreen);
+
+        green2.classList.remove('active');
+        red2.classList.add('active');
+        await delay(timeRed);
+    }
+}
+
+PedestrianTrafficLight(3500, 3500);
+
+function clickBtn() {
+    domEventPromise(knopka, 'click')
+    .then( e => {
+        document.querySelectorAll('div[class*=circle]').forEach((el) => {
+            el.classList.remove('active');
+        })
+        green2.classList.add('active');
+        red.classList.add('active');
+    });
+}
+
+setTimeout(clickBtn(), 2000);
+
+async function speedtest(getPromise, count,parallel = 1){
+    let promiseArr = [];
+    let date = new Date();
+    for(let pr = 0; pr < count; pr++) {
+        promiseArr[pr] = getPromise();
+        await Promise.all(promiseArr);
+    }
+    console.log(promiseArr);
+
+    let duration = new Date() - date;
+    let querySpeed = count / duration;
+    let queryDuration = duration / count;
+    let parallelSpeed = parallel / duration;
+    let parallelDuration = duration / parallel;
+
+    return {
+        duration: duration,
+        querySpeed: querySpeed, //средняя скорость одного запроса
+        queryDuration: queryDuration, //
+        parallelSpeed: parallelSpeed,
+        parallelDuration: parallelDuration
+    }
+}
+    
+speedtest(() => delay(1000), 10, 10 ).then(result => console.log(result))
+// {duration: 10000, 
+// querySpeed: 0.001, //1 тысячная запроса за миллисекунду
+// queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем 
+// parallelSpeed: 0.01  // 100 запросов за 10000 миллисекунд
+// parallelDuration: 100 // 100 запросов за 10000 миллисекунд
+speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5)
+

+ 69 - 0
js_13_async_await_trafficLight/style.css

@@ -0,0 +1,69 @@
+* {
+    box-sizing: border-box;
+}
+
+body {
+    background-color: rgb(105, 179, 179);
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin: 0;
+    min-height: 100vh;
+}
+
+#knopka {
+    width: 70px;
+}
+
+.container, .container2 {
+    background-color: #2c3e50;
+    height: 200px;
+    width: 70px;
+    border-radius: 50px;
+    display: flex;
+    justify-content: space-between;
+    align-items:center;
+    padding: 15px 0;
+    flex-direction: column;
+    margin: 20px 0;
+}
+
+.container2 {
+    height: 140px;
+}
+
+.circleRed {
+    background-color: rgb(0, 0, 0, 0.3);
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+}
+
+.circleRed.active {
+    background-color: red;
+    box-shadow: 0 0 25px red;
+}
+
+.circleYellow{
+    background-color: rgb(0, 0, 0, 0.3);
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+}
+
+.circleYellow.active {
+    background-color: yellow;
+    box-shadow: 0 0 25px yellow;
+}
+
+.circleGreen {
+    background-color: rgb(0, 0, 0, 0.3);
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+}
+
+.circleGreen.active {
+    background-color: green;
+    box-shadow: 0 0 25px green;
+}