Igor_307
@Igor_307
Фрилансер

Как передать параметр из вложенной функции?

Не знаю возможно вопрос идиотский, но никак не найду решения, может не умею искать. Есть некая обвертка для стандартной функции ajax jquery
var flag ;

function query(data, mid, elem){
    
    $.ajax({
            type: 'POST',
            url: path_method,
            data:{ 'data': data, 'm':mid },
            beforeSend: function(){
                loading(elem, 'start');
            },
            success: function(server_response){
                var data = eval("("+server_response+")");
                loading(elem, 'stop');
                
                if(data.status){
                    status(true, data.msg)
                   flag = true;  // в случае успешного выполнения запроса
                 }else{
                    status(false, data.msg)
                  flag = false; // в случае если вернулась ошибка
                }
                
            },
            error: function(err, texterr){
                status(false, 'error_ajax'+texterr)
            }
        })
    
   return flag;  // после выполнения функции flag возвращается как undefined
}

Собственно сам вопрос, как передать параметр flag в return функции query() что она мне вернула успешно или нет? Или может как то можно это по другому реализовать?
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
@StockholmSyndrome
почитайте про асинхронность в JavaScript
на момент, когда запрос выполнится, и вызовется success, return flag; уже давно отработает

можно передавать callback в функцию
function query(data, mid, elem, callback) {
  $.ajax({
    /* ... */
    success: function (server_response) {
      /* ... */
      if (data.status) {
        status(true, data.msg)
        callback(true);
      } else {
        status(false, data.msg)
        callback(false);
      }

    },
    error: function (err, texterr) {
      status(false, 'error_ajax' + texterr)
    }
  });
}


query(data, mid, elem, (flag) => {
  console.log(flag);
});

можно промисом
function query(data, mid, elem) {
  const executor = (resolve, reject) => {
    $.ajax({
      /* ... */
      success: function (server_response) {
        /* ... */
        if (data.status) {
          status(true, data.msg)
          resolve(true);
        } else {
          status(false, data.msg)
          resolve(false);
        }
  
      },
      error: function (err, texterr) {
        status(false, 'error_ajax' + texterr)
        reject();
      }
    }); 
  };
  
  return new Promise(executor);
}


query(data, mid, elem).then((flag) => {
  console.log(flag);
});


если хочется асинхронный код писать синхронно, то можно воспользоваться промисами и async/await
(async () => {
  const flag = await query(data, mid, elem); 
  console.log(flag);
})();
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dollar
@dollar
Делай добро и бросай его в воду.
Вы делаете асинхронный запрос.

Самое простое решение - добавить async: false в параметры ajax. Но гораздо лучше разобраться в этом вопросе и понимать, что вы делаете и зачем оно вам надо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы