jQuery не возвращает true или false

поэтому я делаю это:

function loginFunc(userNameOrEmail, passWord){
        var emailOrUserNameV = encodeURIComponent(userNameOrEmail);
        var passWordV = encodeURIComponent(passWord);
        $.getJSON("http://mysite.com/pullData/login.php?callback=?",
              {
                emailOrUserName: emailOrUserNameV,
                passWord: passWordV
              },
              function(recievedData) {
                if(recievedData[0] == 'true'){
                    return true;
                }
                else{
                    return false;
                }

        });

}

то я делаю это:

$('#loginBtnHtml').click(function(){
            var emailVar = $('#email_html').val();
            var pwdVar = $('#password_html').val();
            if(loginFunc(emailVar, pwdVar)){
                alert('good');
            }
            else{
                alert('bad');
            }

        });

Если я запустил loginFunc() с предупреждением (recievedData [0]); Он отлично работает, как я могу заставить его вернуть bool в $ (' #loginBtnHtml '). click (); ?

Когда я делаю это для устранения неполадок:

$('#loginBtnHtml').click(function(){
            var emailVar = $('#email_html').val();
            var pwdVar = $('#password_html').val();
            var whatIsBeingReturned = loginFunc(emailVar, pwdVar);
            alert(whatIsBeingReturned);

        });

он предупреждает с «Неопределенным» ... не уверен, что я делаю неправильно.

0
nl ja de
Ответ, который вы возвращаете, находится в той форме. Проверьте с помощью пожарной ошибки, что json, который вы возвращаете, находится в правильном формате или нет в некотором json validator.
добавлено автор Meherzad, источник

3 ответы

Вы не можете вернуться из ajax. Если ajax не синхронно (не делайте этого!) Вы не можете зависеть от кода, выполняемого в любом конкретном порядке. Все функциональности, требующей ответа от ajax, должны быть в обратном вызове ajax.

function loginFunc(userNameOrEmail, passWord){
    ...
    return $.getJSON("http://mysite.com/pullData/login.php?callback=?",
}

$("#loginBtnHtml").on('click', function() {
   //snip
   loginFunc(emailVar, pwdVar).done(function (whatIsBeingReturned) {
      console.log(whatIsBeingReturned);
   });
});
7
добавлено
@ user1053263 - это запрос ajax ever ?
добавлено автор Explosion Pills, источник
@JosephSilber выходит из темы, но документы jQuery довольно неясны: api.jquery.com/jQuery .when они используют $. когда в качестве обертки для отложенного в качестве основного примера. Вариант использования, который я могу придумать для $., Когда для одного аргумента: отказ объекта с невыделенным объектом не выполняется.
добавлено автор Explosion Pills, источник
@JosephSilber вполне правдоподобно, но некоторые люди кажутся непреклонными в том, что по какой-то причине отменяют обратный вызов, поэтому я решил эту проблему превентивно
добавлено автор Explosion Pills, источник
@JosephSilber, ты прав. Хорошая точка зрения. Будете ли вы выдвигать меня, если я удалю ссылку на $. Когда ?
добавлено автор Explosion Pills, источник
@JosephSilber правдоподобно (хотя и маловероятно), что вы создаете ссылку на отложенную до , определяется обратный вызов, который вы хотите атаковать. var dfd = $ .Deferred (); function callb() {}; $ .when (dfd) .done (callb); Опять же, он также может использоваться по причинам организации. $. Когда более вероятно, будет использоваться для нескольких отложенных дней, я просто говорю, что это не always единственная причина
добавлено автор Explosion Pills, источник
@JosephSilber Что у меня есть для всех целей и задач, идентичных $. GetJSON (...). Done() . Я просто обновил код, чтобы фактический обратный вызов был выполнен в другом месте. Например, у кого-то может быть больше смысла вести журнал в событии click , но если я определяю обратный вызов .done в loginFunc его там не будет. Это просто организационная вещь.
добавлено автор Explosion Pills, источник
@JosephSilber. Я понимаю, что вы сейчас имеете в виду. Да, вы можете вызвать .done таким образом, чтобы это тоже срабатывало (и немного более эффективно, избегая вызова дополнительных методов), но я думаю, что $. Когда понятнее. Ваш комментарий только о том, что $. Когда для multiple запросов также не обязательно правильный. Это зависит от наличия обратного вызова в отношении отложенного
добавлено автор Explosion Pills, источник
Использование JSONP из-за перекрестного домена, двух разных доменов и серверов.
добавлено автор user1053263, источник
я потерялся, так что лучше использовать последний метод?
добавлено автор user1053263, источник
@JosephSilber, так что вы говорите, я могу сделать что-то вроде loginFunc (emailVar, pwdVar) .done (function (returnData) {if (returnData [0]) {// th & zwnj; is is true}})?
добавлено автор user1053263, источник
Оооо! Обычно я использую другой способ AJAX, но это кросс-домен, поэтому я использую этот путь, не имел понятия, что это не асинхронный. Спасибо! Это сводило меня с ума. Это не позволит мне принять ответ в течение 8 минут.
добавлено автор user1053263, источник
@ExplosionPills - Правда, но это было не мое. Перечитайте мой комментарий. Вы можете вызвать .done() для объекта, возвращаемого из loginFunc . Нет необходимости при .
добавлено автор Joseph Silber, источник
@ExplosionPills - Не уверен, что вы подразумеваете под Это зависит от доступности обратного вызова в отношении отложенного .
добавлено автор Joseph Silber, источник
@ user1053263 - Да. , когда нужен только тогда, когда вам нужно ждать завершения multiple запросов.
добавлено автор Joseph Silber, источник
@ExplosionPills - Опять же, нет необходимости в , когда . Та же функциональность применяется здесь: var dfd = $ .Deferred (); function callb() {}; dfd.done (callb);
добавлено автор Joseph Silber, источник
@ExplosionPills - Конечно. Я считаю, что, когда это возможно, код должен быть самодокументирован. Но если это заставит вас добавить ненужные вызовы функций, то это определенно не стоит.
добавлено автор Joseph Silber, источник
@ExplosionPills - Я не понимаю, что вы там сказали. Разум объясняет, что в условиях мирян?
добавлено автор Joseph Silber, источник
+1 ты все в порядке.
добавлено автор Joseph Silber, источник
@Cory - нет необходимости при . Просто вызовите его непосредственно на возвращаемом объекте jqHXR: loginFunc (emailVar, pwdVar) .done (function() {}) .
добавлено автор Joseph Silber, источник
@ExplosionPills - они пытаются объяснить, что даже если только один отложенный передается при , он всегда будет только возвращать обещание (в отличие от самого отложенного). Они также пытаются продемонстрировать, что объект jqXHR ведет себя как отложенный. Тем не менее, вы правы: документация является запутанной.
добавлено автор Joseph Silber, источник
@ user1053263 - Так как вы делаете запрос на свой сайт, почему вы используете JSONP? Ваш сервер даже настроен для обслуживания JSONP (который JSON завернут в обратном вызове)? Если нет, просто потеряйте часть кода callback =? вашего URL-адреса.
добавлено автор Joseph Silber, источник
+1 для элегантного решения, которое научило меня о $. When() . Благодаря!
добавлено автор Cᴏʀʏ, источник

Ответ на запрос JSON является асинхронным. logicFunc() возвращается до ответного запроса ответа JSON.

Вам нужно написать метод обратного вызова для обработки ответа. Что-то вроде:

function handleResponse(data){ 

    //do something
}


function loginFunc(userNameOrEmail, passWord){
        var emailOrUserNameV = encodeURIComponent(userNameOrEmail);
        var passWordV = encodeURIComponent(passWord);
        $.getJSON("http://mysite.com/pullData/login.php?callback=?",
              {
                emailOrUserName: emailOrUserNameV,
                passWord: passWordV
              },
              handleResponse

        });

}
3
добавлено

Вместо этого попробуйте функцию обратного вызова. AJAX происходит ansync, и функция завершения не может вернуть значение функции обертывания.

function loginFunc(userNameOrEmail, passWord, callbackFn){
        var emailOrUserNameV = encodeURIComponent(userNameOrEmail);
        var passWordV = encodeURIComponent(passWord);
        $.getJSON("http://mysite.com/pullData/login.php?callback=?",{
            emailOrUserName: emailOrUserNameV,
            passWord: passWordV
        }, callbackFn);
}

$('#loginBtnHtml').click(function(){
    var emailVar = $('#email_html').val();
    var pwdVar = $('#password_html').val();

    loginFunc(emailVar, pwdVar, function(recievedData){
        alert(recievedData[0]);
    });

});
1
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском