Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 2
Регистрация: 03.11.2013
Сообщений: 50

Как передать значение из функции при асинхронном выполнении

27.02.2018, 10:16. Показов 1783. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, javascript практически не знаю. Помогите, пожалуйста, выполнить следующую задачу:

Здесь с помощью серверного расширения получаем пол сотрудника:
JavaScript
1
2
3
4
5
6
7
8
9
10
//Тип возвращаемого значения ActionResult
var WebClient;
(function (WebClient) {
    function GetGender(employeeId) {
        var url = urlStore.urlResolver.resolveUrl("GetGender", "AdvanceReport");
        url = url + "?employeeId=" + employeeId;
        return requestManager.get(url);
    }
    WebClient.GetGender = GetGender;
})(WebClient || (WebClient = {}));
По этой части вопросов нет. Если пол мужской - значение 1, если женский - 0, иначе - текст Exception
Идём дальше. Есть такой код:

JavaScript
1
2
3
4
5
6
7
8
function getGender(employeeId) {
    var gen;
     WebClient.GetGender(employeeId).then(function (res) { 
        gen = res;       // Здесь gen ==2, т.е. успешно получено значение
    });      
     alert(gen);    //Здесь gen undefined
     return gen;    // Здесь gen == 2
}
Мне не нужно выводить значение gen. но если убрать alert(gen), return gen вернёт undefined.
Насколько понимаю, это из-за асинхронного режима работы. Вроде, может помочь использование setTimeout, но как правильно его применить в этом случае?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.02.2018, 10:16
Ответы с готовыми решениями:

Передать во второй запрос значение id, сгенерированное при выполнении первого запроса insert
две таблицы ... 1 таблицаLOGIN имеет логины и пароли + Id с типом uniqueidentifier и имеет(newid). id вторая TECHER имена фамилии итд......

Не читается значение при асинхронном запросе
Здравствуйте, использую стандартный скрипт для получения данных по "url" (читаю из PHP скрипта): // Возвращаем значение...

Как передать значение в функцию так, чтобы при изменение значения в функции оно менялось во всей программе?
#include <stdio.h> #include <stdlib.h> void sum(int a) { a = 10; printf("%d\n", a); }

4
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
28.02.2018, 11:21
Не уверен, но может быть надо из function (res) тоже вернуть return'ом gen? 7-я строка должна быть выше 6-й
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,815
28.02.2018, 14:14
Elfin83, Вам следует понять, в каком порядке исполняется код. WebClient.GetGender выполняет запрос к серверу асинхронно, остальной код продолжает работать, не дожидаясь ответа от сервера. Как только асинхронная функция сигнализирует о своей готовности, она становится в конец очереди на исполнение. Т.е. даже если ответ от сервера приходит моментально, то сначала выполнится весь код, только потом сработает then. Все действия с полученными данными нужно производить внутри блока then(), вернуть еще не полученное значение не получится, и setTimeout не поможет. Вам следует поменять логику. К примеру вы можете передавать функцию callback, и ее вызывать.
0
1 / 1 / 2
Регистрация: 03.11.2013
Сообщений: 50
01.03.2018, 11:05  [ТС]
atanov, к сожалению, так не работает

sad67man, пробую делать так (по аналогии с примерами из инета):

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
    var gender;
    getGender(employeeId, function (result) {
    alert(result);    //Выводит 2
    gender = result;
    });
    alert(gender);    //Выводит undefined
    alert(gender);    //Выводит 2
 
function getGender(employeeId, callback) {
    WebClient.GetGender(employeeId).then(function (res) {       
        callback(res);
    });
}
То есть в конечном итоге имеем то, с чего всё начиналось.
Как правильно в данном случае применить callback?
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,815
02.03.2018, 01:39
Лучший ответ Сообщение было отмечено Elfin83 как решение

Решение

Elfin83, Вы пытаетесь сделать что-то типо такого
JavaScript
1
var gender = getGender();
Где getGender - это аякс запрос. Так сделать не получится. Вам нужно поменять общую логику. Вопрос для чего вы получаете пол? что вы потом с ним собираетесь делать. Вот это нужно делать внутри callback функции.

Добавлено через 9 минут
Я уже выше описал как работают асинхронные функции. Суть заключается в том, что callback функция, которая исполняется после ответа от сервера должна быть самодостаточной. Остальной код не должен от нее зависеть и ожидать ответа от сервера.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.03.2018, 01:39
Помогаю со студенческими работами здесь

Передать значение из функции в нее же саму при следующем вызове
нужно передать значение pustie в функцию и из нее при каждом взятии этой функции вот заголовки: LRESULT CALLBACK WndProc(HWND, UINT,...

Определить, как изменится значение указателя при выполнении кода
При выполнении операции: double *p; ++p; значение указателя р увеличится на: Выберите один ответ: 4

Как передать значение из функции
Всем доброе время суток! Такой вопрос, у меня есть функция, с неё нужно достать значение и передать его на вывод в chart, никак не...

Как передать функции значение int?
Пытаюсь передать функции значение int, но не получается. Синтаксически все правильно, но не компилируется. Как сделать так, шоб работало,...

Как из функции передать значение в main()
#include <conio.h> #include <stdio.h> #include <stdlib.h> #include <time.h> int fun(int *a1, int N) { int i, sum=0; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru