Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 1
Регистрация: 04.08.2019
Сообщений: 19

bind (Симпсон К. - Вы не знаете JS)

03.06.2020, 23:45. Показов 1394. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пример из книги "Вы не знаете JS. This и Прототипы Объектов"
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
var LoginController = {
    errors: [],
 
    getUser: function() {
        return document.getElementById("login_username").value;
    },
 
    getPassword: function() {
        return document.getElementById("login_password").value;
    },
 
    validateEntry: function(user,pw) {
        user = user || this.getUser();
        pw = pw || this.getPassword();
        if (!(user && pw)) {
            return this.failure("Please enter a username & password!");
        }
        else if (pw.length < 5) {
            return this.failure("Password must be 5+ characters!");
        }
        // управление передано сюда? Проверка прошла успешно!
        return true;
    },
 
    showDialog: function(title,msg) {
        // вывести сообщение для пользователя в диалоговом окне
    },
 
    failure: function(err) {
        this.errors.push( err );
        this.showDialog( "Error", "Login invalid: " + err );
    }
};
 
 
// Связывание `AuthController` для делегирования `LoginController`
var AuthController = Object.create( LoginController );
AuthController.errors = [];
AuthController.checkAuth = function() {
    var user = this.getUser();
    var pw = this.getPassword();
    if (this.validateEntry( user, pw )) {
        this.server( "/check-auth",{user: user,pw: pw } )
    .then( this.accepted.bind( this ) )
    .fail( this.rejected.bind( this ) );
    }
};
 
AuthController.server = function(url,data) {return $.ajax( {url: url, data: data } );
};
 
AuthController.accepted = function() {
    this.showDialog( "Success", "Authenticated!" )
};
AuthController.rejected = function(err) {
    this.failure( "Auth Failed: " + err );
};
Добавлено через 21 минуту
Вопрос

JavaScript
1
2
3
4
5
if (this.validateEntry( user, pw )) {
        this.server( "/check-auth",{user: user,pw: pw } )
    .then( this.accepted.bind( this ) )
   .fail( this.rejected.bind( this ) );
}
Своими словами: если "this.validateEntry(user, pw)" вернет "true", то введенные данные отправляются на сервер. В случаи ответа без ошибки выплняется код
JavaScript
1
 .then( this.accepted.bind( this ) )
, а если сервер вернул ошибку , то код
JavaScript
1
.fail( this.rejected.bind( this ) );
Верно???

Если верно, то следующий вопрос:

JavaScript
1
.fail( this.rejected.bind( this ) )
вызывает функцию
JavaScript
1
2
3
AuthController.rejected = function(err) {
    this.failure( "Auth Failed: " + err );
};
Что попадает в параметр "err "??? ошибка от сервера?

И последний вопрос:

можно ли вместо
JavaScript
1
2
[JS].then( this.accepted.bind( this ) )
    .fail( this.rejected.bind( this ) )
[/JS]
написать
JavaScript
1
2
.then( this.accepted() )
    .fail( this.rejected() )
то есть без bind?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.06.2020, 23:45
Ответы с готовыми решениями:

Гомер Симпсон
Обеденный перерыв Гомера Симпсона составляет T миллисекунд. Один гамбургер Гомер съедает за N миллисекунд, один чизбургер - за M. Какое...

Гомер Симпсон
Обеденный перерыв Гомера Симпсона составляет T миллисекунд. Один гамбургер Гомер съедает за N миллисекунд, один чизбургер - за M. Какое...

Симпсон + Графика
Задание: вычислить значение определенного интеграла по формуле Симпсона. Решение должно быть наглядно представлено пользователю в виде...

2
 Аватар для zontik24
36 / 33 / 10
Регистрация: 14.06.2013
Сообщений: 432
04.06.2020, 02:37
Лучший ответ Сообщение было отмечено amr-now как решение

Решение

Цитата Сообщение от DiscoN Посмотреть сообщение
Что попадает в параметр "err "??? ошибка от сервера?
Да
Цитата Сообщение от DiscoN Посмотреть сообщение
И последний вопрос:
можно ли вместо
JavascriptВыделить код
1
2
JavaScript
1
2
.then( this.accepted.bind( this ) )
    .fail( this.rejected.bind( this ) )
написать
JavascriptВыделить код
1
2
.then( this.accepted() )
    .fail( this.rejected() )
то есть без bind?
Это надо для надежности, чтобы не потерять контекст
Если хочешь без bind, то нужно использовать стрелочные функции
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
04.06.2020, 18:48
Скрипт в синтаксисе ES2015:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>TypeScript HTML App</title>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
 
</head>
<body>
    <input id="login_username">
    <input id="login_password">
    <button>Отправить</button>
    <script src="scripts/app.js"></script>
</body>
</html>
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
let LoginController = {
    errors: [],
    getUser() {
        return document.getElementById("login_username").value;
    },
    getPassword() {
        return document.getElementById("login_password").value;
    },
    validateEntry(user, pw) {
        user = user || this.getUser();
        pw = pw || this.getPassword();
        if (!(user && pw)) {
            return this.failure("Please enter a username & password!");
        }
        else if (pw.length < 5) {
            return this.failure("Password must be 5+ characters!");
        }
        // управление передано сюда? Проверка прошла успешно!
        return true;
    },
    showDialog(title, msg) {
        // вывести сообщение для пользователя в диалоговом окне
        alert(title + "\n" + msg);
    },
    failure(err) {
        this.errors.push(err);
        this.showDialog("Error", "Login invalid: " + err);
    }
};
// Связывание `AuthController` для делегирования `LoginController`
let AuthController = {
    async checkAuth() {
        let user = this.getUser();
        let pw = this.getPassword();
        if (this.validateEntry(user, pw)) {
            try {
                await this.server("/check-auth", { user: user, pw: pw }).promise();
                this.accepted();
            }
            catch (error) {
                this.rejected(error);
            }
        }
    },
    server(url, data) {
        return $.ajax({ url, data });
    },
    accepted() {
        this.showDialog("Success", "Authenticated!");
    },
    rejected(err) {
        console.log(err);
        this.failure("Auth Failed: " + err.statusText);
    },
    __proto__: LoginController
};
 
document.querySelector("button").onclick = button_click;
 
async function button_click() {
    await AuthController.checkAuth();
}
Выяснилось, что jQuery криво выбрасывает объект ошибки.
jQuery на голубом глазу предлагает в catch положить jqXHR, а не Error

Так что лучше jQuery.ajax() промисифицировать собственноручно. Ошибка станет правильной.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.06.2020, 18:48
Помогаю со студенческими работами здесь

Квадратуре Симпсон
Помогите пожалуйста #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; #include &lt;fstream&gt; ...

Построение графика. Перевод кода с С++. Симпсон
Доброго времени суток. Составил программу на С++, ранее с маткадом не имел дела. Помогите составить график. Пытался сам. вот что вышло,...

Почему если я задаю IP 127.0.0.1 то bind возвращает 0, а если задаю IP в сети, то bind возвращает -1
IP узнаю через 2IP.ru вот и если задаю полученный IP, то программа вылатает когда выполняется условие if (status == -1) ...

ЗНАЕТЕ ЛИ ВЫ?
Чтобы получить суточную дозу железа нужно скушать 48 564 зернышка граната. 70 % инфарктов, гипертонических кризов и инсультов случаются...

Какие СУБД вы знаете?
Подскажите пожалуйста Какие СУБД вы знаете? Что такое архитектура &quot;клиент-сервер&quot;? Что такое web-сервер? Какие типы RAID...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru