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

Почему-то не работает функция

24.08.2021, 10:18. Показов 960. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Функция запрашивает у php массив склонений для текстовой строки
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function sklonen(str) {
//  alert(str);
    if (str.length==0) {
    return false;
    }
    if (window.XMLHttpRequest) {
        xmlhttp=new XMLHttpRequest();
    }
    else {  // код для IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange=function() {
        if (this.readyState==4 && this.status==200) {
//          alert(this.responseText);
        let res = JSON.parse(this.responseText);
            console.log('склонения: ' +res);
            return res;
        }
    }
    xmlhttp.open("GET","/advocates/finder.php?sklonen="+str,true);
    xmlhttp.send();
}
И в консоли они нормально появляются

Но вот вызов функции
JavaScript
1
2
sklonen_arr = sklonen(name);
alert(sklonen_arr);
возвращает undefined


Что я делаю не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2021, 10:18
Ответы с готовыми решениями:

Почему не работает функция?
Почему не работает функция? function CircleMove() { document.getElementById("crazycircle").onmouseover = function(event) { ...

почему не работает функция?
#include <iostream> #include <conio.h> void function (int k)// { for(int i=0;i<k;i++) std::cout<<"*"; } int...

Почему не работает функция
Почему не работает такая функция <?php function cc($r,$c,$d){ $r = 1; $с = 2; $d = 3; ...

9
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
24.08.2021, 10:31
Причина простая.
Код, который вы исполняете, асинхронный. Коллбек-функция, переданная в свойство onreadystatechange объекта XMLHttpRequest вызывается только после ответа от сервера, тогда как код ниже в основном потоке продолжает исполняться, не дожидаясь ответа от сервера.
JavaScript
1
2
3
4
5
6
7
8
9
10
function sklonen(str) {
    // ...
    xmlhttp.onreadystatechange=function() {
        // Эта функция исполнится только после ответа от сервера
    }
    // А тем временем продолжим заниматься своими делами...
    xmlhttp.open("GET","/advocates/finder.php?sklonen="+str,true);
    xmlhttp.send();
}
alert(sklonen(name)); // Упс, undefined. Во-первых, функция sklonen() ничего не возвращает (нет инструкции return), во-вторых, сервер ещё не успел ответить
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
24.08.2021, 10:36
rtt1971, вот современный способ запроса к серверу с использованием async/await:
PHP/HTML
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
<!DOCTYPE html>
<html>
 
<head>
    <meta charset="utf-8">
</head>
 
<body>
    <input type="button" id="btn" value="Загрузить">
    <script>
        /**
         * TAP-версия загрузки JSON по HTTP
         * @param {RequestInfo} url Строка URL или объект Request
         * @param {RequestInit | undefined} init Объект с опциями к запросу
         * @returns {Promise<any>} Обещание вернуть JSON-объект
         */
        async function fetchJSONAsync(url, init) {
            let response = await fetch(url, init);
            if (response.ok) {
                let json = await response.json();
                return json;
            }
            else
                throw new Error(`${response.status}: ${response.statusText}`);
        }
 
        document.getElementById("btn").onclick = btn_click;
 
        // Асинхронная функция, являющаяся например обработчиком кнопки
        // или при событии загрузки страницы
        async function btn_click() {
            let str = "стол";
            let url = "/advocates/finder.php?sklonen=" + encodeURIComponent(str);
            try {
                let res = await fetchJSONAsync(url);
                console.log(res);
            } catch (error) {
                console.log(error.message);
            }
        }
    </script>
</body>
 
</html>
2
0 / 0 / 1
Регистрация: 27.03.2020
Сообщений: 201
24.08.2021, 11:21  [ТС]
Ну тут я усомнюсь.. return там есть, да и изнутри функции строка показывается..
JavaScript
1
2
3
4
5
6
7
8
xmlhttp.onreadystatechange=function() {
        if (this.readyState==4 && this.status==200) {
//          alert(this.responseText);
        let res = JSON.parse(this.responseText);
            console.log('склонения: ' +res);
            return res;
        }
    }
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
24.08.2021, 11:46
Цитата Сообщение от rtt1971 Посмотреть сообщение
Ну тут я усомнюсь..
Вы сомневаетесь в нашей компетентности?
Цитата Сообщение от rtt1971 Посмотреть сообщение
return там есть
return у вас находится в анонимной функции-коллбеке. Данный return не имеет никакого отношения к функции sklonen()
Цитата Сообщение от rtt1971 Посмотреть сообщение
изнутри функции строка показывается
В том-то и дело, что изнутри. Эта функция будет вызвана после ответа от сервера с нужными данными. Всё, что написано ниже - до ответа от сервера.
0
0 / 0 / 1
Регистрация: 27.03.2020
Сообщений: 201
24.08.2021, 14:23  [ТС]
Все понял, спасибо!

Теперь еще вопрос:
Если вызываю пхп скрипт напрямую из браузера с параметрм ФИО, то он нормально склоняет
Если вызываю из JS точно также то не склоняет, как будто видит одно слово
Такое впечатление что JS передает пробелы как-то иначе..

пробовал encodeURI - urldecode - то же самое
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
24.08.2021, 15:30
Смотрите в консоль вкладку Network (Сеть) какие параметры у вас передаются на сервер. Убедитесь, что они корректные.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
24.08.2021, 16:02
rtt1971, если сервер ругается, используйте замену %20 на +
JavaScript
1
2
3
4
5
6
7
8
        /**
         * Возвращает строку, в которой все не цифробуквенные символы, кроме -_.
         * должны быть заменены знаком процента (%), за которым следует два шестнадцатеричных числа,
         * а пробелы кодируются как знак сложения (+).
         * Строка кодируется тем же способом, что и POST данные WWW-формы,
         * то есть по типу контента application/x-www-form-urlencoded.
        */
        const phpUrlEncode = (v) => encodeURIComponent(v).replace(/%20/g, "+");
По сути штатная функция encodeURIComponent() не согласована по стандартам с серверами. Дикость.
1
0 / 0 / 1
Регистрация: 27.03.2020
Сообщений: 201
10.01.2022, 12:05  [ТС]
Возвращаясь к теме...
В ответе пришел object Promise.
Как из него выковырять ответ сервера?
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
12.01.2022, 13:37
Цитата Сообщение от rtt1971 Посмотреть сообщение
В ответе пришел object Promise.
JavaScript
1
2
3
promiseObject.then((response) => {
  console.log(response);
})
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.01.2022, 13:37
Помогаю со студенческими работами здесь

Почему не работает функция?
Вот понадобилась функция для взятия остатка от деления нецелых чисел написал такую: long double OperationDouble( long double a , long...

Почему функция не работает?
Читал учебник по haskell: &quot;Изучай Haskell во имя добра!&quot;. Там упоминается использование таких функций как: 1) boomBangs xs = 2)...

почему не работает функция?
Доброго времени суток! Есть диапазон в ячейке С2 и 4 одинаковых по длине полуинтервалов значениям которых будут соответствовать...

Почему не работает функция?
Привет всем. Есть код: SET ifile=param.txt SET tfile=%ifile%.tmp SET find=FA_ALERT=1 SET replace=FA_ALERT=0 IF EXIST...

Почему-то на работает функция!(
Задача написать функцию, упорядочивающую массив по возрастанию. почему-то не работает((( #include &quot;stdio.h&quot; int...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru