Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277

Вложенные $post и области видимости

23.09.2015, 17:55. Показов 886. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Есть три таблицы, заказ - детали - поставки они вложены как матрешки, мне надо посчитать сколько в заказе поставок с stat = 36, но в переменную варн не попадют данные, когда объявишь переменную и используешь её во вложенной функции то работает, а если еще два раза вложить внутрь функций то уже не видит.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    $.post("func/buy_readorders.php", {}, function(data){  //читаем заказы
        var prov = eval(data); var warn = 0;
        prov.forEach(function(item, i, arr) { //к каждому заказу...
            $.post("func/buy_readlist.php", {id: item['key']}, function(data){ //... читаем детали
                var prov = eval(data);
                prov.forEach(function(item, i, arr) { //а к каждой детали...
                    $.post("func/buy_readsupp.php", {id: item['key'], stat: "36"}, function(data){ //...читаем поставки
                        var prov = eval(data); 
                        if(prov!=false) {warn += prov.length} //и если совпадение нашлось прибавляем количество
                    });
                });
            });
        });
        alert(warn);
    });
Хотелось бы без глобальных переменных обойтись, и немного разъясните, если можно, где какая переменная будет видна, у меня просто много в коде потом будет таких матрешек, так что это ключевой можно сказать для понимания темы пример, может я зря во всех вложенных функциях одинаковые аргументы в скобках использую.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.09.2015, 17:55
Ответы с готовыми решениями:

Вложенные классы, зона видимости класса, заголовочный фаил
Добрый день! Пока писал вопрос нашел ответ)) Но возник другой! Class A { public: void GetInfoA() ...

Области видимости
Если я запихиваю любые операции (в данном случае задание и заполнение массива); То далее не видит, не то что не заполненный массив, а...

Области видимости объектов
Здравствуйте. Подскажите, пожалуйста, по каким правилам объекты в java видны или соответственно не видны в пределах того или иного метода...

7
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
25.09.2015, 11:58  [ТС]
Все же в надежде на ответ, попытаюсь упростить пример, а то вроде просмотры темы есть, но наверное вам в код вникать лень. Итак.
JavaScript
1
2
3
4
5
6
7
    var reslt="";
    var prov1 = [2,3,4];
prov1.forEach (function (item, i, arr) {
        reslt += '-'+(prov1[i]);
        console.log('in'+reslt);
    });
console.log('out '+reslt);
ответ консоли:
in-2
in-2-3
in-2-3-4
out -2-3-4

То есть мы видим что переменная меняется как внутри функции, так и снаружи в неё попали все данные и их можно считать. Далее добавляем функцию $.post которая даже ничего не будет делать.

JavaScript
1
2
3
4
5
6
7
8
9
10
    var reslt="";
    var prov1 = [2,3,4];
 
$.post("func.php", {t: '1'}, function(data1){
    prov1.forEach (function (item, i, arr) {
        reslt += '-'+(prov1[i]);
        console.log('in'+reslt);
    });
});
console.log('out '+reslt);
Ответ консоли:
out
in-2
in-2-3
in-2-3-4

То есть данные во внешний мир не попали. Почему?
Кстати они в другом порядке теперь. то есть выходит сначала выполняется вывод out а потом только то что внутри пост. может поэтому.
0
100 / 106 / 50
Регистрация: 22.09.2015
Сообщений: 433
25.09.2015, 12:05
Они попадают, просто console.log срабатывает раньше чем post. Если переместить console.log в функцию поста, то всё работает как вам надо (если я правильно вас понял):
JavaScript
1
2
3
4
5
6
7
8
9
10
var reslt="";
var prov1 = [2,3,4];
 
$.post("/echo/json/", {t: '1'}, function(data1){
    prov1.forEach (function (item, i, arr) {
        reslt += '-'+(prov1[i]);
        console.log('in'+reslt);
    });
    console.log('out '+reslt);
});
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
25.09.2015, 12:16  [ТС]
Прочитал про синхронность запросов. Все дело в этом. Если переписать код вот так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var reslt="";
$.ajax({
    url: "func.php",
    type: "POST",
    data: {t: "2"},
    async: false,
    success: function(data) {
        var ans = eval(data);
        ans.forEach (function(item, i, arr) {
            reslt+= '-'+(item);
            console.log('in '+item);
        });
    }
});
console.log('out '+reslt);
то будет правильно записывать и выводить.
Только в консоли предупреждение:
Синхронный XMLHttpRequest в главном потоке устарел из-за его вредного воздействия на опыт конечного пользователя. Для получения дополнительной помощи , проверьте http://xhr.spec.whatwg.org/.
В чем вред может быть интересно?
0
100 / 106 / 50
Регистрация: 22.09.2015
Сообщений: 433
25.09.2015, 12:19
Уф, http://xmlhttprequest.ru/#use
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
25.09.2015, 12:21  [ТС]
Silver22, ваш метод конечно работает. только в первом сообщении у меня в коде в самом внутреннем уровне инкрементируется переменная и мне хотелось бы вывести уже финальный итог, а если внутри поста выводить то все промежуточные шаги тоже выведутся много раз. В любом случае, спасибо за ответ.
0
100 / 106 / 50
Регистрация: 22.09.2015
Сообщений: 433
25.09.2015, 12:33
Уф, А если сразу все данные загрузить с сервера 3 запросами (сейчас у вас получается очень много запросов) и потом уже работать с этими данными?
0
 Аватар для Уф
890 / 725 / 447
Регистрация: 13.07.2015
Сообщений: 2,277
25.09.2015, 13:24  [ТС]
Идея неплохая. я подумаю, вобщем лесенка из аджаксов для трех заказов у меня выполняется 1.5 секунды, это очень долго. Теперь я думаю на уровне бд этот запрос выдумать. Подскажешь?
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT *
FROM public.buysupp
WHERE listkey IN (
    SELECT KEY
    FROM public.buylist
    WHERE orderkey IN (
        SELECT KEY
        FROM public.buyorder
        WHERE STATUS='12'
        )
        ) AND STATUS='36'
Нужно кудато GROUP BY или COUNT вставить, я пока думаю только.

Добавлено через 14 минут
Кайф! Все работает, и выполняется запрос за 15мс.
SQL
1
2
3
4
SELECT buyorder.key, COUNT(buysupp.key) AS warn
FROM public.buyorder, public.buylist, public.buysupp
WHERE buylist.orderkey=buyorder.key AND buysupp.listkey=buylist.key AND buysupp.status = '36'
GROUP BY buyorder.key
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.09.2015, 13:24
Помогаю со студенческими работами здесь

Масштабирование области видимости
glm::mat4 g_projMatrix = glm::ortho( x1, x2, y1, y2, z1, z2); А вот если хочу отдалить объект? Самое...

Области видимости функций
Добрый день. Написал класс, помогите найти ошибки #include <iostream> #include <string> #include <vector> using...

Имя области видимости
Подскажите, как получить имя области видимости функции? Т.е. допустим чтобы обратиться к глобальной переменной, можно обратиться так: ...

Области видимости переменных
Когда последняя инструкция в foo присваивает новое значение переменной x, компилятор решает, что это локальная переменная. Следовательно,...

Области видимости в Builder
Совсем запутался с областью видимости описываю класс-в том же модуле из обработчика событий кнопки его не видно создаю модуль-из него...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru