Как мне передать пользовательские параметры в метод обратного вызова метода jQuery AJAX?

#jquery #ajax #parameters #callback

#jquery #ajax #параметры #обратный вызов

Вопрос:

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

У меня есть PHP, генерирующий файл records.json, который мое приложение должно запросить для логики нескольких методов.

 function queryRecords(recordId, requiredField) {
    $.ajax("javascript/records.json", {
        dataType: "json",
        success: callBack,
        error: function (jqXhr, textStatus, errorMessage) {
            alert("AJAX error: unable to retrieve records from records.jsonnn"   errorMessage);
        }
    });
}

function callBack(response) {
    $.each(response, function(index, records) {
        if (records["MediaItemID"] == recordId) {
            $.each(records, function(key, value) {
                if (key == requiredField) {
                    return value;
                }
            });
        }
    });
}

queryRecords("14", "MediaItemName");
  

Каждый раз, когда мне нужно запросить записи, мне нужно передать RecordID и requiredField, чтобы получить значение поля этой записи (согласно циклам в методе обратного вызова). Однако, похоже, я ограничен этим подходом, потому что я не могу передать эти значения в качестве параметров при успехе. Если я выводю на консоль в успешном выполнении, я вижу значение, но мне нужен доступ к значению за пределами успеха, и вот как далеко я продвинулся. Я видел так много страниц об этом, что у меня болит голова. Пожалуйста, вы можете помочь?

Ответ №1:

Я протестировал код, предложенный вhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function просто чтобы посмотреть, смогу ли я получить доступ к значению за пределами обещания, и это не удалось, как это всегда делалось…

 var xyz = "please";

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve('resolved');
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  const result = await resolveAfter2Seconds();
  xyz = resu<
  //console.log(result);
  // expected output: "resolved"
}

asyncCall();

console.log(xyz);
  

Он возвращает «пожалуйста».

Либо я не понимаю предоставленные решения, либо то, чего я пытаюсь достичь, не понимается. Я рад признать, что это проблема «меня».

Ответ был бы простым, если бы речь шла только о том, чтобы установить значение async равным false в запросе ajax, но это устарело.

Ответ таков: я сдаюсь, но только потому, что для нескольких методов, вероятно, неразумно полагаться на несколько вызовов ajax для их логики.

Поэтому вместо этого я собираюсь импортировать записи из файла json в массив, чтобы у меня всегда был доступ к данным без этой головной боли.

Ответ №2:

Попробуйте, как,

 function queryRecords(recordId, requiredField) {
  return new Promise((resolve, reject) => {
      $.ajax("javascript/records.json", {
        dataType: "json",
        success: function (response) {
          resolve(callBack(recordId, requiredField, response));
        },
        error: function (jqXhr, textStatus, errorMessage) {
            reject(errorMessage);
        }
    });
  });
}

function callBack(recordId, requiredField, response) {
  $.each(response, function(index, records) {
      if (records["MediaItemID"] == recordId) {
          $.each(records, function(key, value) {
              if (key == requiredField) {
                  return value;
              }
          });
      }
  });
}
queryRecords("14", "MediaItemName").then(response => {
  // response will contain your return value
}).catch(errorMessage => {
  alert("AJAX error: unable to retrieve records from records.jsonnn"   errorMessage);
});
  

Пример реализации,

 function queryRecords(userId) {

      return new Promise((resolve, reject) => {
          $.ajax("https://jsonplaceholder.typicode.com/todos", {
            dataType: "json",
            success: function (response) {
              resolve(callBack(userId, response));
            },
            error: function (jqXhr, textStatus, errorMessage) {
                reject(errorMessage);
            }
        });
      });
    }

    function callBack(userId, response) {
      let filteredTodos = [];
      $.each(response, function(index, todo) {
          if (todo.userId == userId) {
              filteredTodos.push(todo);
          }
      });
      return filteredTodos;
    }
           
    queryRecords(1).then(filteredTodos => {
      alert(filteredTodos);
    }).catch(errorMessage => {
      alert("AJAX error: unable to retrieve records from records.jsonnn"   errorMessage);
    });  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>  

Комментарии:

1. Спасибо, но он по-прежнему выводит undefined.

2. возвращаемое значение; вы не можете вернуть значение из обратного вызова. Это то, что вы хотите сделать? В этом случае я могу обновить код с помощью Promise. Дайте мне знать.

3. Ах, я этого не знал. Да, мне нужно настроить переменные, такие как var context = queryRecords(RecordID, «ConsumptionStatus»); и var recordIsVisible = queryRecords(RecordID, «RecordIsVisible») == «1» ? true : false; поэтому все, что мне нужно, это возвращаемое значение из запроса AJAX.

4. Спасибо. Я реализую это для целей тестирования: console.log(«Вне ajax / promise: » queryRecords(«14», «MediaItemName»).then(response => {}).catch(ErrorMessage => { alert(«Ошибка AJAX: не удается извлечь записи из records.json n n» ErrorMessage); })); но получение… jquery-3.4.1.min.js:2 jQuery. Отложенное исключение: не удается прочитать свойство ‘then’ неопределенного TypeError: не удается прочитать свойство ‘then’ неопределенного ( localhost /MediaTracker /v2/javascript/frontend.js:555:51 ) jquery-3.4.1.min.js Неперехваченная ошибка типа: не удается прочитать свойство ‘then’ неопределенного

5. Извините, что ввел тип. Добавьте возврат до, новое обещание, например, return new Promise(. Я обновил ответ.