Как вернуть значение функции после нажатия кнопки в JQuery?

У меня есть функция, которая при вызове возвращает результат функции обещания.

У меня есть метод executeScript, который динамически обрабатывает методы Javascript и возвращает обещание о том, что возвращают эти методы.

Базовый скелет

Ref.executeScript({
                code: "getData(); function getData(){ var res = 'Hello'; return res;}",
            function(results){
     console.log(results); ////THIS RETURNS "Hello"
   });

Когда код напрямую возвращает переменную, он работает. Например, следующее при выполнении возвращает Hello.

getData();
 function getData(){
   var res = "Hello";
   return res;
  }

Но если я верну его в событии щелчка, он вернет предыдущее значение «Hello», а не «Hello2» при нажатии кнопки. Я хочу вернуть "Hello2".

getData();
function getData(){
 var res = "Hello";
 jQuery("#myButton").on('click', function(){
   res = "Hello2";
   alert(res); //this gets called
  });
return res;
}

Обновлен исходный вопрос для большей ясности


person Sourav Das    schedule 06.02.2019    source источник
comment
Следует ли getData() дождаться отправки .on() перед возвратом значения? Но если я верну его внутри события щелчка, он вернет предыдущее значение Hello, а не Hello2 при нажатии кнопки. Я хочу, чтобы возвращалось Hello2. Никакое значение не returned из обработчика click.   -  person guest271314    schedule 06.02.2019
comment
попробуйте использовать оператор возврата внутри функции обратного вызова щелчка   -  person Niraj Kumar    schedule 06.02.2019
comment
@ guest271314 да, я хочу, чтобы getData () дождался завершения события on. Он должен возвращаться только тогда, когда нажатие кнопки обновляет модель   -  person Sourav Das    schedule 06.02.2019
comment
что такое myButton? класс или идентификатор кнопки?   -  person Swati    schedule 06.02.2019
comment
@SouravDas Вы можете использовать jQuery.Deferred для возврата объекта обещания jQuery или использовать встроенный конструктор new Promise() для разрешения значения после отправки события click, а затем связать .then() с функцией, переданной в качестве параметра, где аргументом является выполненное обещание jQuery или значение Promise .   -  person guest271314    schedule 06.02.2019
comment
Все, что ваша функция делает с jQuery('#myButton').on(...), - это устанавливает прослушиватель событий щелчка на вашем #myButton элементе. Вы должны заставить этого слушателя выполнять необходимые инструкции, поскольку они будут происходить только тогда, когда вы щелкнете на элементе   -  person Phil    schedule 06.02.2019
comment
@Phil, мне нужно вернуть значение, вычисленное по событию щелчка, обратно в основную функцию   -  person Sourav Das    schedule 06.02.2019
comment
Маловероятно, что вам это действительно нужно. Вы должны объяснить, что должно произойти и когда, имея в виду, что любое событие щелчка будет запущено спустя много времени после того, как getData() завершит выполнение.   -  person Phil    schedule 06.02.2019
comment
@ guest271314 и другие, я обновил свой вопрос, чтобы лучше понять его. Приносим извинения за путаницу   -  person Sourav Das    schedule 06.02.2019
comment
.executeScript() используется в расширении Chromium / Chrome?   -  person guest271314    schedule 06.02.2019
comment
Вы пытаетесь получить измененное значение res, которое является локальным, когда вы регистрируете его для события. res в анонимной функции и getData() разные, поэтому вы не получаете желаемого результата. Глобальные переменные решат проблему, но они не являются хорошей практикой программирования.   -  person capnam    schedule 06.02.2019
comment
@ guest271314, да, он используется в плагине InAppbrowser для кордовы   -  person Sourav Das    schedule 06.02.2019
comment
@SouravDas Не отображается документация упомянуть обработку асинхронных процессов для details Если внедренный сценарий имеет тип кода, обратный вызов выполняется с одним параметром, который является возвращаемым значением сценария, заключенным в массив .. Хотя это answer утверждает, что .executeScript() - это Promise, где .then() можно связать.   -  person guest271314    schedule 06.02.2019
comment
@ guest271314 вы правы, предупреждение работает, но я не получаю значение в then, если оно срабатывает при нажатии кнопки   -  person Sourav Das    schedule 06.02.2019
comment
@SouravDas Не пробовал Cordova InAppBrowser, непроверено function getData() { return new Promise(function(resolve) { jQuery("#myButton").on('click', function() { resolve("Hello2") }) }) }   -  person guest271314    schedule 06.02.2019
comment
@SouravDas См. Также github.com/apache/cordova-plugin-inappbrowser/issues/ 279. Думали ли вы о том, чтобы задать вопрос, каков предлагаемый подход к использованию асинхронного кода на .executeScript()?   -  person guest271314    schedule 06.02.2019
comment
@ guest271314 это видел. пробовал. не сработало. но в этом случае мы просто возвращаем небольшую строку. Я подниму вопрос там. Спасибо   -  person Sourav Das    schedule 06.02.2019
comment
Давайте продолжим это обсуждение в чате.   -  person Sourav Das    schedule 06.02.2019


Ответы (3)


Конечно, он по-прежнему возвращает «Hello», потому что, когда вы вызываете эту функцию, она не входит в функцию щелчка. На самом деле ваша функция устанавливает действие для события щелчка, но не вызывает его. Вы действительно не можете вернуть значение в функции события щелчка, и я не могу представить, где оно вам понадобится. Вы можете попробовать такие переменные вне области видимости, но я не рекомендую это делать:

var hasBeenClicked = false;
jQuery("myButton").on('click', function(){ 
     hasBeenClicked = true;
});

function buttonWasClicked() {
     var res = hasBeenClicked;
     hasBeenClicked = false;
     return res;
});
person Edward Codarcea    schedule 06.02.2019

Я думаю, вы хотите обновить значение при событии щелчка, для этого вам нужно использовать прототип javascript, попробуйте это

function GetData(){
   this.res = "Hello";

} 
jQuery("#myButton").on('click', function(){

   GetData.prototype.res = "Hello2";
     alert(res); //this gets called
  });
  getData  = new GetData();
  console.log (getData.res)
person Niraj Kumar    schedule 06.02.2019

вы должны написать что-то вроде этого:

var res = '';
function getData(){
    res = "Hello";
    return res;
}

$(document).ready(function() {
    $("#myButton").click(function(e){
       e.preventDefault(); //if you have form to submit
       res = "Hello2";
    });
});
person Free Code    schedule 06.02.2019
comment
При нажатии кнопки с id = 'myButton' значение res будет 'Hello2'. - person Free Code; 07.02.2019