Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
1

Как отследить, что событие выполняется и как отследить что оно завершилось?

05.08.2020, 20:02. Показов 1516. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как отследить, что событие выполняется и как отследить что оно завершилось?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2020, 20:02
Ответы с готовыми решениями:

Как отследить окно treview что оно активно
Всем привет не подскажите как отследить окно treview что оно активно. Просто у меня файловый...

Как отследить что рестартит ПК
Я не спец по ОС и железу, подскажите как что делать :) Началось всё с того, что стал вылетать...

Как отследить что стало инициатором вызова формы и как это использовать?
Здравствуйте) В общем задача, как мне видится тривиальная) но что то не могу придумать решение....

Как отследить, что пользователь закрыл форму?
Добрый день! Подскажите, как отследить, что именно пользователь, а не программа закрыла форму? У...

7
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
06.08.2020, 08:48 2
Цитата Сообщение от AlexKOR5 Посмотреть сообщение
событие выполняется
Я так понимаю, в браузере событие - это атомарная операция. Возможно вы имели ввиду обработчик события?
1
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
06.08.2020, 09:27  [ТС] 3
Я имел ввиду обработчик события.
0
409 / 161 / 32
Регистрация: 26.11.2019
Сообщений: 434
06.08.2020, 16:25 4
Пропишите какой-нибудь вывод в консоль, например в начале, середине и конце функции - обработчика
1
50 / 14 / 3
Регистрация: 15.02.2019
Сообщений: 514
06.08.2020, 17:39  [ТС] 5
Пропишите какой-нибудь вывод в консоль, например в начале, середине и конце функции - обработчика

Смотрите с началом и серединой выполнения события ваш вариант подойдет, но как отследить, что событие только что завершилось, чтобы я мог выполнить какие-то действия сразу после этого. Что-то типа Колбека.
0
368 / 234 / 68
Регистрация: 19.07.2016
Сообщений: 833
06.08.2020, 18:18 6
Паттерн обсервер применяйте.

Добавлено через 34 минуты
Самый простецкий пример (если все правильно понял) выглядит как нибудь так:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function server(customer) {
 
  let timeout = setTimeout( function() {
 
    customer('Data received')
 
    clearTimeout(timeout)
 
  }, 2000)
}
 
function customer(data) {
 
  console.info(data)
}
 
server(customer)
0
Эксперт JS
6492 / 3903 / 2005
Регистрация: 14.06.2018
Сообщений: 6,781
07.08.2020, 16:24 7
AlexKOR5, Peskova_Sveta, D_Vik, по справочнику Task Asynchronous Pattern:
https://docs.microsoft.com/ru-... g-progress

Вывести на экран слово из текстового поля с ожиданием каждого символа 100 мс:
index.html
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Progress</title>
    <style>
        div{
            height:20px;
        }
    </style>
</head>
<body>
    <input id="source"> <input type="button" id="btn" value="Start">
    <div id="out"></div>
    <div id="status1"></div>
    <progress id="progress1" max="100" value="0"></progress>
    <script src="scripts/app.js"></script>
</body>
</html>
Исходник на TypeScript:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
type Action<T> = (v: T) => void;
 
interface IProgress<T> {
    report(value: T): void;
}
/*
 * Task.Delay()
 */
const delay = (ms: number) => new Promise(resolve => { setTimeout(resolve, ms); });
/**
 * Упрощенный вариант издателя события без MulticastDelegate
 */
class Progress<T> implements IProgress<T> {
    private _actions: Action<T>[];
 
    constructor(action?: Action<T>) {
        this._actions = [];
        // Аргумент в данном конструкторе может отсутствовать.
        if (action instanceof Function)
            this._actions.push(action);
    }
    report(value: T) {
        for (let action of this._actions)
            action(value);
    }
    /**
     * Упрощенный вариант добавления обработчиков события без MulticastDelegate
     * @param {Action<T>} action Обработчик события с сигнатурой Action<T>
     */
    progressChanged(action: Action<T>) {
        if (!(action instanceof Function))
            throw new Error("Argument is not a function");
        this._actions.push(action);
    }
}
 
let source: HTMLInputElement = <any>document.getElementById("source"),
    btn: HTMLButtonElement = <any>document.getElementById("btn"),
    progress1: HTMLProgressElement = <any>document.getElementById("progress1"),
    out: HTMLDivElement = <any>document.getElementById("out"),
    status1: HTMLDivElement = <any>document.getElementById("status1");
 
btn.onclick = <any>btn_click;
 
async function btn_click(this: HTMLButtonElement) {
    out.textContent = "";
    status1.textContent = "";
    this.disabled = true;
    try {
        await downloadStringAsync(
            source.value,
            new Progress(s => {
                out.textContent = s;
 
                progress1.value = Math.floor(s.length / source.value.length * 100);
            }));
        // Любые действия после завершения обработчика события
        status1.textContent = "Вывод на экран завершен.";
    }
    catch (error) {
        status1.textContent = "Ошибка вывода на экран.";
    }
    finally {
        this.disabled = false;
    }
}
 
 
async function downloadStringAsync(str: string, progress: IProgress<string>) {
    let s = "";
    for (let e of str) {
        await delay(100);
        s += e;
        progress.report(s);
    }
}
Результат компиляции в JavaScript:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
 * Task.Delay()
 */
const delay = (ms) => new Promise(resolve => { setTimeout(resolve, ms); });
/**
 * Упрощенный вариант издателя события без MulticastDelegate
 */
class Progress {
    constructor(action) {
        this._actions = [];
        // Аргумент в данном конструкторе может отсутствовать.
        if (action instanceof Function)
            this._actions.push(action);
    }
    report(value) {
        for (let action of this._actions)
            action(value);
    }
    /**
     * Упрощенный вариант добавления обработчиков события без MulticastDelegate
     * @param {Action<T>} action Обработчик события с сигнатурой Action<T>
     */
    progressChanged(action) {
        if (!(action instanceof Function))
            throw new Error("Argument is not a function");
        this._actions.push(action);
    }
}
let source = document.getElementById("source"), btn = document.getElementById("btn"), progress1 = document.getElementById("progress1"), out = document.getElementById("out"), status1 = document.getElementById("status1");
btn.onclick = btn_click;
async function btn_click() {
    out.textContent = "";
    status1.textContent = "";
    this.disabled = true;
    try {
        await downloadStringAsync(source.value, new Progress(s => {
            out.textContent = s;
 
            progress1.value = Math.floor(s.length / source.value.length * 100);
        }));
        // Любые действия после завершения обработчика события
        status1.textContent = "Вывод на экран завершен.";
    }
    catch (error) {
        status1.textContent = "Ошибка вывода на экран.";
    }
    finally {
        this.disabled = false;
    }
}
async function downloadStringAsync(str, progress) {
    let s = "";
    for (let e of str) {
        await delay(100);
        s += e;
        progress.report(s);
    }
}
Тут как раз случай, когда скрипт без исходника на TypeScript не имеет никакой ценности.
1
368 / 234 / 68
Регистрация: 19.07.2016
Сообщений: 833
07.08.2020, 16:32 8
А в чем смысл дженериков ? Это ж по сути тоже самое что и any.
1
07.08.2020, 16:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2020, 16:32
Помогаю со студенческими работами здесь

Как отследить, что забыли вставить дискету?
написал тут прогу для хороших знакомых.Файл очень тяжелый,на дискету не поместится.А им надо все...

Как отследить в Edit, что пользователь нажал Enter?
Господа извеняюсь за такой наивный вопрос , но что то совсем не получается сделать . Как отследить...

Как отследить что форма не перекрыта другими окнами
Доброго времени суток! Есть форма, нужно отследить момент когда эту форму не перекрывают другие...

Как отследить, что в ячейке таблицы поменялось значение?
подскажите, как отследить, что в ячейке менялось значение, если там были произведены действия,...

Как отследить, что скачивается с локального компьютера в локальной сети?
Можно ли в локальной сети на локальном компьютере увидеть, какие файлы с него скачиваются на другие...

Как отследить, что юзер пришел именно с конкретной страницы с формой?
В моей книге было описано, как предохраниться от следующего: юзер набиреат полный путь в строке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru