Вытащить return из callback функции

yaski

web3
Регистрация
21 Фев 2010
Сообщения
658
Реакции
500
Есть функция js
HTML:
function getData(){
        var options = {
             fromBlock: 0,
             toBlock: 'latest',
             address: address
            };
        var filter = web3.eth.filter(options);
        filter.get(function res(error, eventResult){
            if (!error)
                data = JSON.stringify(eventResult, null, 2);
            console.log(data);
          return data;
        });
    };
В консоли выводятся полученные значения data. Подскажите как получить значения data из callback функции res в основную функцию.
з.ы. C промисами не дружу(
 
var blah = filter.get(...
 
Результат все равно не возвращается, возвращается текст запроса
 
Теперь дошло. Я не особо знаю, что делает ф-ция web3.eth.filter(...), но самый банальный вариант - это объявить глобальную переменную а-ля lastStoredData и внутри ф-ции res просто сохранять data в lastStoredData. Соответственно, после каждого выполнения filter.get(...) в переменно lastStoredData будет последнее использованное значение переменной data.
 
undefined выдает((
Походу без промисов никак
Функция в ajax запросе вызывается, а там асинхрон
если вешаю ее на клик по кнопке, все нормально отрабатывается и выдает результат
 
Последнее редактирование:
Если lastStoredData объявлена правильно, в области window, то undefined ты можешь получать только в том случае, если пытаешься взять из нее данные раньше, чем они присвоены. Такое, в первую очередь, наблюдается в тех случаях, когда колбэки пытаются по сети тянуть какие-то данные, на что уходит время. В таких случаях есть 2 вариант: 1) синхронное выполнение; 2) проверять результат спустя некоторое время. Для реализации второго варианта можно попробовать использовать setTimer/setInterval. Я не уверен, что промисы решат данный вопрос.
 
В таких случаях есть 2 вариант: 1) синхронное выполнение; 2) проверять результат спустя некоторое время. Для реализации второго варианта можно попробовать использовать setTimer/setInterval. Я не уверен, что промисы решат данный вопрос.
Или перейти на промисы. Я так понимаю именно это ТС и надо. Либо сделать callback внутри данной функции.

На промисах
Для просмотра ссылки Войди или Зарегистрируйся
На callback
Для просмотра ссылки Войди или Зарегистрируйся

На промисах функция остаётся переиспользуемой (в других функциях, отдельно можно вызвать). На callback соответственно нет.

PS Извиняюсь, конечно выше речь не про callback в полном смысле этого термина, а для обозначения варианта решения.
 
Последнее редактирование:
Или перейти на промисы. Я так понимаю именно это ТС и надо. Либо сделать callback внутри данной функции.

На промисах
Для просмотра ссылки Войди или Зарегистрируйся
На callback
Для просмотра ссылки Войди или Зарегистрируйся

На промисах функция остаётся переиспользуемой (в других функциях, отдельно можно вызвать). На callback соответственно нет.


А как результат загнать в аякс запрос в data вместо eRes?
В консоли содержимое eRes отображается
HTML:
  function getData(){
     return new Promise(function(resolve, reject) {
        var options = {
          fromBlock: 0,
          toBlock: 'latest',
          address: address
         };
       var filter = web3.eth.filter(options);
       data2 = filter.get(function res(error, eventResult){
         if (!error)
           eResult = JSON.stringify(eventResult, null, 2);
       });
     //return(eResult);
     setTimeout(function(){
     resolve(eResult);
     },2000);
   })
  };

  function update() {
      var eRes;
      $.ajax({
          url: "update.php",
          datatype: "json",
          type: "POST",
          data: eRes,
                   
          beforeSend: function(){
              getData().then(function(eRes){
                  console.log(eRes);
              })
          });
  }
  }
 
Не совсем понимаю что надо.

Код:
function update() {
   getData().then(function(answer){
      var eRes;
      $.ajax({
          url: "update.php",
          datatype: "json",
          type: "POST",
          data: answer,
            
          beforeSend: function(res){
                  console.log(res);
          }
        })
    })
}
Вместо beforeSend обычно используют что-то типа done или success
Если используется jQ, то стоит почитать справку, что за что отвечает
Для просмотра ссылки Войди или Зарегистрируйся
 
Я надеюсь в примере понятно показал, что setTimeout использован чтобы эмулировать ассинхронную функцию.
В твоём случае надо писать как я написал в заккоментированом коде, специально его вставил:
вместо return eResult - вставляется resolve(eResult), это своего рода аналог в промисах.
Либо reject, если это ошибка. По сути тоже аналог return, но позваляет промисам понять, что произошла ошибка.
То есть представь, что ты возвращаешь объект
Код:
return : {
  done : "всё хорошо прекрасная Маркиза",
  еrror : 'ошибок нет'
}
И чтобы потом не проверять if/else return.done/return.еrror, грубо говоря и используется resolve() и reject().
И потом jquery подобный лапшевидный код проверяет, он же аналогичен try/catch
Код:
FUNCTION()
  .then(function(){}) // Тут выполняем функцию если нет ошибок
  .catch(function(){}) // Тут выполняем функцию если есть ошибка
 
Назад
Сверху