Полезные заметки php, jquery, mysql, ubuntu, android
admin
Очень часто бывает такая задача: просклонять слово в зависимости от числа и вывести не 21 комментариев а 21 комментарий и […]
Read more
irusik
В это статье мы рассмотрим как вставить в таблицу Excel одну или несколько строк.
Read more
irusik
В большинстве случаев информация воспринимается гораздо лучше, если она представлено наглядно — в виде графика или диаграммы. В Эксель есть […]
Read more
irusik
Excel предлагает очень много возможностей для работы с данными. В нем можно проводить безумное количество вычислений без особого труда. В […]
Read more
irusik
При создании документа в Microsoft Excel по умолчанию применяется шрифт Calibri с размером 11 px. Иногда необходимо его изменить, увеличить […]
Read more
adminИногда возникает такая задача, которая может казаться довольно глупой
Read more
irusik
Часто возникает необходимость посмотреть сохраненные пароли в браузере, например, для того, чтобы передать его кому-то или набрать на другом устройстве. […]
Read more
irusik
Случалось ли вам работать в большим количеством вкладок в браузере? Если да, то наверняка вы закрывали нужные вкладки. В этой […]
Read more
admin
Как то раз задался вопросом: как можно отслеживать исходящий трафик с сервера на centos, debian или ubuntu?
Read more
На сегодняшний день Яндекс является самой популярной поисковой системой в России и СНГ. В этой статье мы рассмотрим как сделать […]
Read more
irusik
Иногда необходимо сфотографировать экран монитора. Существует несколько способов сделать снимок экрана на компьютере или ноутбуке с системой Windows. Рассмотрим самый […]
Read more
Всем известно, что интернет-браузеры сохраняют историю посещений и поиска. Иногда требуется полностью стереть историю просмотров.
Read more
- Популярное
- Новое
Запросы и мутации ⚡️ React с примерами кода
На этой странице Вы узнаете подробно о запросах к GraphQL серверу.
Поля
По простому, GraphQL запрашивает определенные поля у объектов. Давайте посмотрим на очень простой запрос и результат, который мы получим:
RequestResponse
1 2 3 4 5 | { hero { name } } |
1 2 3 4 5 6 7 | { "data": { "hero": { "name": "R2-D2" } } } |
Вы можете сразу увидеть, что запрос имеет точно такую же форму, как и результат. Это важно для GraphQL, так-как Вы всегда получаете то, что Вы ожидаете, и сервер точно знает, что запрашивает клиент.
Поле name возвращает тип String в данном случае имя главного героя Star Wars, «R2-D2».
Да, и еще одно — этот запрос является интерактивным. Это означает, что Вы можете изменить его, как Вам нравится, и увидеть новый результат. Попробуйте добавить поле appearsIn в объект hero в запросе, и увидите новый результат.
В предыдущем примере, мы просто запросили имя нашего героя, который вернул строку, но поля также могут относиться и к объектам. В этом случае, Вы можете сделать дополнительный выбор (sub-selection) полей для данного объекта. GraphQL запросы могут включать связанные объекты (related objects) и их поля, позволяя клиентам получать много связанных данных (related data) в одном запросе, вместо того чтобы делать несколько запросов, как это нужно было-бы нужно в классической REST архитектуре.
RequestResponse
1 2 3 4 5 6 7 8 9 | { hero { name # Queries can have comments! friends { name } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "data": { "hero": { "name": "R2-D2", "friends": [ { "name": "Luke Skywalker" }, { "name": "Han Solo" }, { "name": "Leia Organa" } ] } } } |
Обратите внимание, что в этом примере, поле friends возвращает массив элементов. GraphQL запросы выглядят одинаково для одного элемента или списка, однако мы знаем, что из этого следует ожидать, основываясь на том, что указано в схеме.
Аргументы
Если единственное, что мы делали, это получали объекты и их поля, GraphQL уже был очень полезный язык для выборки данных. Но когда Вы добавляете возможность передавать аргументы полям, все становится гораздо интереснее.
RequestResponse
1 2 3 4 5 6 | { human(id: "1000") { name height } } |
1 2 3 4 5 6 7 8 | { "data": { "human": { "name": "Luke Skywalker", "height": 1.72 } } } |
В системе, как REST, можно передавать только один набор аргументов — параметры запроса и URL сегментов в запросе. Но в GraphQL, каждое поле и вложенный объект могут получить свой собственный набор аргументов, поэтому с помощью GraphQL можно избежать нескольких запросов для API-выборок. Вы даже можете передать аргументы в скалярных полях, для осуществления преобразования данных один раз на сервере, а не для каждого клиента в отдельности.
RequestResponse
1 2 3 4 5 6 | { human(id: "1000") { name height(unit: FOOT) } } |
1 2 3 4 5 6 7 8 | { "data": { "human": { "name": "Luke Skywalker", "height": 5. 6430448 } } } |
Аргументы могут быть разных типов. В приведенном выше примере, мы использовали тип Enumeration
, который представляет одно значение из нескольких вариантов (в данном случае единицы измерения длины, как METER
или FOOT
). GraphQL поставляется со стандартным набором типов, но GraphQL сервер также может объявить свой собственный пользовательский тип, поскольку он может быть сериализован в Вашем ответе.
Подробнее о типах системы GraphQL.
Псевдонимы
Если Вы предельно внимательны, Вы, возможно, заметили, что, хоть поля объекта-результата соответствуют имени поля в запросе, но они не включают аргументы. Вы не можете сделать запрос непосредственно для того же самого поля с разными аргументами. Вот почему Вам нужны псевдонимы — они позволяют Вам переименовывать результат поля во что Вам угодно.
RequestResponse
1 2 3 4 5 6 7 8 | { empireHero: hero(episode: EMPIRE) { name } jediHero: hero(episode: JEDI) { name } } |
1 2 3 4 5 6 7 8 9 10 | { "data": { "empireHero": { "name": "Luke Skywalker" }, "jediHero": { "name": "R2-D2" } } } |
В приведенном выше примере два поля hero
будут конфликтовать, но так как мы использовали разные псевдонимы, то можно получить оба результата в одном запросе.
Фрагменты
Допустим, у нас есть относительно сложная страница в нашем приложении, которая дает нам посмотреть на героев бок о бок, вместе со своими друзьями. Вы можете представить, что такой запрос мог бы быстро усложниться, потому что нам бы понадобилось повторить поля по крайней мере дважды — один для каждой стороны сравнения.
Вот почему GraphQL содержит в себе многоразовые блоки названные фрагментами. Фрагменты позволяют Вам создавать наборы полей, а затем включать их в запросы где Вам это необходимо. Вот пример того, как Вы могли бы решить описанную ситуацию используя фрагменты:
RequestResponse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | { leftComparison: hero(episode: EMPIRE) { ...comparisonFields } rightComparison: hero(episode: JEDI) { ...comparisonFields } } fragment comparisonFields on Character { name appearsIn friends { name } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | { "data": { "leftComparison": { "name": "Luke Skywalker", "appearsIn": [ "NEWHOPE", "EMPIRE", "JEDI" ], "friends": [ { "name": "Han Solo" }, { "name": "Leia Organa" }, { "name": "C-3PO" }, { "name": "R2-D2" } ] }, "rightComparison": { "name": "R2-D2", "appearsIn": [ "NEWHOPE", "EMPIRE", "JEDI" ], "friends": [ { "name": "Luke Skywalker" }, { "name": "Han Solo" }, { "name": "Leia Organa" } ] } } } |
Вы можете увидеть, как вышеупомянутый запрос будет довольно однообразный, если поля повторяются. Концепция фрагментов часто используется для разделения сложных требований данных приложений на более мелкие куски, особенно когда Вам необходимо объединить множество компонентов пользовательского интерфейса с разными фрагментами в исходные данные выборки.
Переменные
До сих пор мы писали все наши аргументы внутри строки запроса. Но в большинстве приложений аргументы к полям будут динамическими: Например, может быть раскрывающийся список, позволяющий выбрать интересующий вас эпизод Star Wars, поле поиска или набор фильтров.
Не было бы хорошей идеей передавать эти динамические аргументы непосредственно в строке запроса, потому что тогда нашему клиентскому коду необходимо будет динамически манипулировать строкой запроса во время выполнения и сериализовать ее в формат, специфичный для GraphQL. Вместо этого GraphQL имеет первоклассный способ отделить динамические значения от запроса и передать их как отдельный словарь. Эти значения называются переменными.
Когда мы начинаем работать с переменными, нам нужно сделать три вещи:
- Замените статическое значение в запросе переменной
$variableName
- Объявить
$variableName
в качестве одной из переменных, принимаемых запросом - Передать
variableName: value
в отдельном транспортном словаре (обычно JSON) переменных
Вот как это выглядит все вместе:
RequestПеременныеResponse
1 2 3 4 5 6 7 8 | query HeroNameAndFriends($episode: Episode) { hero(episode: $episode) { name friends { name } } } |
{ "episode": "JEDI" } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "data": { "hero": { "name": "R2-D2", "friends": [ { "name": "Luke Skywalker" }, { "name": "Han Solo" }, { "name": "Leia Organa" } ] } } } |
Теперь в нашем клиентском коде мы можем просто передать другую переменную, а не создавать совершенно новый запрос. Это также является хорошей практикой для обозначения того, какие аргументы в нашем запросе должны быть динамическими — Мы никогда не должны делать строковую интерполяцию для построения запросов из пользовательских значений.
Определения переменных
Определения переменных — это часть, которая выглядит как ($episode: Episode)
в указанном выше запросе. Он работает так же, как определения аргументов для функции на типизированном языке. В нем перечислены все переменные с префиксом $
, за которыми следует их тип, в этом случае Episode
.
Все объявленные переменные должны быть либо скалярами, перечислениями, либо типами входных объектов. Поэтому, если Вы хотите передать сложный объект в поле, Вам нужно знать, какой тип ввода соответствует этому на сервере. Подробнее о типах входных объектов см. на странице схемы.
Определения переменных могут быть необязательными или обязательными. В случае выше, так как нет !
рядом с типом Episode
, это необязательно. Но если в поле, в которое передается переменная, требуется аргумент non-null, то переменная должна быть обязательной.
Чтобы узнать больше о синтаксисе этих определений переменных, полезно изучить язык схемы GraphQL. Язык схемы подробно объясняется на странице схемы.
Название операции
Одна вещь, которую мы также видели в примере выше, это то, что наш запрос получил название операции. До сих пор мы использовали сокращенный синтаксис, в котором опускали как ключевое слово запроса, так и имя запроса, но в production полезно использовать их, чтобы сделать наш код менее двусмысленным.
Думайте об этом так же, как о имени функции на вашем любимом языке программирования. Например, в JavaScript мы можем легко работать с анонимными функциями, но когда мы даем функции имя, ее легче отследить, отладить наш код анализируя логи по именам функций. Точно так же запросы GraphQL и mutation имена вместе с именами фрагментов могут быть полезным средством отладки на стороне сервера для идентификации различных запросов GraphQL.
Директивы
Мы обсудили выше, как переменные позволяют нам избегать ручной интерполяции строк для построения динамических запросов. Передача переменных в аргументах решает довольно большой класс этих проблем, но нам также может понадобиться способ динамического изменения структуры и формы наших запросов с использованием переменных. Например, мы можем представить компонент пользовательского интерфейса, который имеет сводный и подробный вид, где один включает в себя больше полей, чем другой.
Давайте создадим запрос для такого компонента:
RequestПеременныеResponse
1 2 3 4 5 6 7 8 | query Hero($episode: Episode, $withFriends: Boolean!) { hero(episode: $episode) { name friends @include(if: $withFriends) { name } } } |
1 2 3 4 | { "episode": "JEDI", "withFriends": false } |
1 2 3 4 5 6 7 | { "data": { "hero": { "name": "R2-D2" } } } |
Попробуйте изменить перечисленные выше переменные, передав true
для withFriends
и посмотреть, как изменится результат.
Нам нужно было использовать новую функцию в GraphQL, называемую директивой. Директива может быть присоединена к включению поля или фрагмента и может повлиять на выполнение запроса любым способом, который пожелает сервер. Основная спецификация GraphQL включает ровно два каталога
@include(if: Boolean)
Только включает это поле в результат, если аргумент имеет значениеtrue
.@skip(if: Boolean)
Пропускает это поле, если аргумент имеет значениеtrue
.
Директивы могут быть полезны для выхода из ситуаций, когда в противном случае Вам понадобится манипулировать строками для добавления и удаления полей в вашем запросе. Реализации сервера могут также добавлять экспериментальные функции, определяя полностью новые директивы.
Мутации
Большинство обсуждений GraphQL сосредоточено на выборке данных, однако любая полная платформа также нуждается в способе изменения данных на стороне сервера.
В REST любой запрос может привести к некоторым побочным эффектам на сервере, но по соглашению предполагается, что GET-запросы не используются для изменения данных. GraphQL похож, — технически любой запрос может быть реализован, для того, чтобы перезаписать данные. Однако полезно установить соглашение о том, что любые операции, вызывающие изменения данных, должны быть отправлены явным образом через мутации.
Как и в запросах, если mutation поле возвращает тип объекта, Вы можете запросить вложенные поля. Это может быть полезно для извлечения нового состояния объекта после обновления. Давайте посмотрим на простой mutation пример:
RequestПеременныеResponse
1 2 3 4 5 6 7 8 9 | mutation CreateReviewForEpisode( $ep: Episode! $review: ReviewInput! ) { createReview(episode: $ep, review: $review) { stars commentary } } |
1 2 3 4 5 6 7 | { "ep": "JEDI", "review": { "stars": 5, "commentary": "This is a great movie!" } } |
1 2 3 4 5 6 7 8 | { "data": { "createReview": { "stars": 5, "commentary": "This is a great movie!" } } } |
Обратите внимание, что поле createReview
возвращает поля stars
и commentary
только что созданного обзора. Это особенно полезно при изменении существующих данных, например, при увеличении поля, поскольку мы можем изменять и запрашивать новое значение поля с помощью одного запроса.
Вы также можете заметить, что в этом примере переменная обзора, которую мы передали, не является скаляром. Это тип входного объекта, особый тип типа объекта, который может быть передан в качестве аргумента. Подробнее о типах ввода см. на странице схемы.
Несколько полей в мутациях
Mutation может содержать несколько полей, как и query. Кроме имени, cуществует одно важное различие между query и mutation:
Хотя поля запроса выполняются параллельно, mutation поля запускаются последовательно, один за другим.
Это означает, что если мы пошлем две mutations incrementCredits
в одном запросе, первое гарантируется до завершения второго, гарантируя, что мы не закончим с самим условием гонки.
Встроенные фрагменты
Как и многие другие системы типов, схемы GraphQL включают в себя возможность определения интерфейсов и типов соединений.
Если вы запрашиваете поле, которое возвращает интерфейс или тип объединения, Вам нужно будет использовать встроенные фрагменты для доступа к данным на конкретном типе. Проще всего увидеть на примере:
RequestПеременныеResponse
1 2 3 4 5 6 7 8 9 10 11 | query HeroForEpisode($ep: Episode!) { hero(episode: $ep) { name ... on Droid { primaryFunction } ... on Human { height } } } |
{ "ep": "JEDI" } |
1 2 3 4 5 6 7 8 | { "data": { "hero": { "name": "R2-D2", "primaryFunction": "Astromech" } } } |
В этом запросе поле hero
возвращает тип Character
, который может быть либо Human
, либо Droid
в зависимости от episode
аргумента. В прямом выборе вы можете запрашивать только поля, которые существуют на интерфейсе Character
, такие как name
.
Чтобы запросить поле по конкретному типу, Вам нужно использовать встроенный фрагмент с условием типа. Поскольку первый фрагмент помечен как ... on Droid
, поле primaryFunction
будет выполняться только в том случае, если Character
, возвращенный из hero
, имеет тип Droid
. Аналогично полю height для типа Human
.
Именованные фрагменты также могут использоваться таким же образом, поскольку именованный фрагмент всегда имеет прикрепленный тип.
Мета-поля
Учитывая, что существуют ситуации, когда Вы не знаете, какой тип Вы получите от сервиса GraphQL, Вам нужно каким-то образом определить, как обрабатывать эти данные на клиенте. GraphQL позволяет Вам запросить __typename
, мета-поле, в любой точке запроса, чтобы получить имя типа объекта в этой точке.
RequestResponse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | { search(text: "an") { __typename . .. on Human { name } ... on Droid { name } ... on Starship { name } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | { "data": { "search": [ { "__typename": "Human", "name": "Han Solo" }, { "__typename": "Human", "name": "Leia Organa" }, { "__typename": "Starship", "name": "TIE Advanced x1" } ] } } |
В вышеупомянутом запросе search
возвращает тип объединения, который может быть одним из трех вариантов. Невозможно отличить разные типы от клиента без поля __typename
.
Сервисы GraphQL предоставляют несколько метаполей, остальная часть которых используется для Introspection system.
[Script]-Как передать несколько переменных через Ajax?
Аналогичный вопрос
- Невозможно отобразить частичный вид при использовании $. ajax
- Очистка поля ввода при размытии
- CKeditor Inline: повторяет идентификаторы абзаца
- Jquery добавляет 3 входных тега в таблицу
- вложенный элемент запускает родительское событие
- Объединить значения флажка и входные значения в текстовую область диапазона
- css макет div с плавающей запятой
- Как получить обратный вызов от Angular при отображении представления
- Изменение не производится по событию onclick для данных, загружаемых динамически
- Поиск и выделение шаблона из текста jquery
- не удается заставить атрибут-заполнитель работать в IE с помощью iframe
- Одно представление Backbone не работает после перезагрузки страницы
- Пользовательский цвет фона для календаря td
- Как получить текстовые поля при нажатии на содержимое вкладки
- Проверка пароля jQuery 6-10 символов и 1 числовое значение
- Ожидание ввода данных пользователем с помощью jQuery и Javascript
- Uncaught referenceerror не определен — добавление функции javascript при использовании Angular
- В флажке без нажатия кнопки отправки, как отправить выбранное значение флажка?
- Попытка создать повторно используемую функцию для создания раскрывающихся списков с помощью JavaScript и JQuery
- HTML5
счет:4
Принятый ответСвязанный запрос
- Попытка передать несколько переменных из нескольких окон через AJAX
- Как передать переменные JS в данные AJAX?
- как передать несколько значений контроллеру codeigniter с помощью ajax
- Как изменить цепочку вызовов или обещаний ajax, чтобы несколько переменных (из массива) можно было использовать в отдельных вызовах ajax?
- Как передать несколько параметров из представления в контроллер без запроса ajax
- Как получить ответ через ajax с типом данных как jsonp и с переменными полезной нагрузки
- Как передать несколько значений из сервлета Java в javascript с помощью ajax jquery
- я хочу передать текст нажатой кнопки, когда есть несколько кнопок через ajax mvc
- Как передать содержимое текстовой области с помощью TinyMCE через AJAX
- Как динамически передавать переменные через вызов функции?
- Как отправить несколько переменных Javascript в PHP с помощью jQuery AJAX
- Как передать идентификаторы селекторов в качестве переменных в JQuery через casperjs?
- Как передать переменную javascript в функцию php по URL-адресу Ajax?
- Как передать данные сообщения в php-код с помощью вызова ajax
- Dropzone JS: как заставить URL-адреса каждого изображения передаваться как отдельный запрос AJAX после процесса загрузки?
- Как передать переменные в iFrame все в jQueryFunction
- как пропустить ответ ajax вне вызова ajax
- Как передать данные из POJO и контроллера в Ajax
- Как отправить данные и изображение вместе через ajax json в asp. net mvc
- как передать переменные из контроллера в модель в codeigniter
- JS Ajax OnClick: как выполнить код php несколько раз?
- Как передать больше данных автозаполнения ajax
- Как обновить данные в HTML, если запрос ajax вызывается несколько раз
- Как передать динамический URL-адрес функции через onload
- Как анализировать несколько объектов JSON, полученных от сервлета, с помощью AJAX
- Как вызывать несколько независимых вызовов jquery ajax параллельно и вызывать функцию, когда все они завершатся
- как передать class_id с section_id как в ajax
- Использование AJAX для чтения канала XML (или JSON). Как я могу передать данные в свой код, чтобы я мог работать с ним?
- Множественные вызовы Ajax с переменными mysql и сеанса
- Как передать массив через функцию jquery get?
- Javascript: как отправить несколько данных в Ajax или Json
- Как передать переменные в динамический UIkit Modal?
- Источник Ajax возвращает в ответ несколько меток. Как я могу добавить новую строку после первой метки
- Node.js: как передать параметры маршрута при указании URL-адреса в запросе AJAX POST?
- Как передать значения в раскрывающийся список множественного выбора с помощью хэша URL-адреса
- Как передать значение в AJAX без обновления с проверкой
- Как создать объект javascript с несколькими свойствами AJAX?
- Как передать информацию через jQuery
- JQuery: как поместить несколько файлов в formData с помощью dropzone. js и отправить их через ajax
- Как прокрутить ответ ajax и отобразить его в HTML
- как передать значение функции с помощью ajax
- Как передать значение из jquery ajax в сервлет, я сталкиваюсь с ошибкой 404 при передаче URL-адреса
- Получение нескольких данных через AJAX в PHP?
- Как добавить несколько значений в качестве объекта к одному параметру в запросе jQuery ajax?
- Как передать данные нескольких массивов в ajax?
- Как я могу отделить вызов ajax для отправки в несколько записей базы данных на основе множественного выбора
- Как выполнить цикл через функцию ajax и получить результат из базы данных, зациклив порядок
- Magento Ajax Request — как правильно передавать данные?
- Как сделать множественный выбор jQuery ajax
- Как можно получить данные из нескольких переменных с помощью кнопки, открывающей модальное окно начальной загрузки?
Еще запрос из того же тега
- как получить значение флажка флажка, который является результатом запроса mysql
- Индексация строки справа налево с помощью функции JavaScript substr
- Как выбрать родителя с помощью селектора
- Оптимизация CSS и Javascript (проблема со скоростью)
- jQuery изменить значение переменной в раскрывающемся списке выбрать из базы данных
- Как заполнить выпадающий список из ответа ajax?
- Объединение анимации jquery
- Требуется динамическое изменение div при нажатии ссылки на боковой панели с данными JSON
- Как использовать пространство имен в jQuery
- добавить класс CSS в строки, начинающиеся с заглавной буквы
- Обновление фиксированной высоты в jquery или javascript
- кросс-браузерный способ получения содержимого contenteditable
- Как открыть функцию прокрутки в модальном окне Bootstrap из другого модального окна?
- Как получить регион вместо почтового индекса для стран ОАЭ с помощью API карт Google?
- Как вызвать объект внутри $(document). ready извне
- Остановка обработчика прокрутки после того, как кто-то щелкнул элемент
- Защита небезопасных источников изображений на стороне клиента
- WordPress WP_QUERY с GET и AJAX
- отключить кнопку карусели при запуске программы
- jQuery — Как перемещать объект влево и вправо
- Плагин jsPDF не работает до ie9
- Как отобразить область в html из пользовательской директивы в angular?
- Как удалить запись с помощью jquery в cakephp?
- Проверка jQuery для текстового поля и радиокнопок
- Заполните ввод, используя сохраненные данные
- Добавить класс при щелчке и удалить при повторном щелчке для этого конкретного tr или span
- Как вывести сообщение об ошибке только для выделенного поля?
- Как удалить содержимое из div, но сохранить загружаемое изображение?
- Кэш ajax false не работает для загрузки изображения
- Как добавить задержку открытия диалогового окна «Печать» до полной загрузки страницы или PDF: JS
Написание лучшего AJAX.
Руководство по написанию лучшего AJAX… | Терри Мун | Кодирование и дизайн Опубликовано в·
Чтение: 4 мин.·
15 декабря 2014 г.Руководство по написанию лучших вызовов AJAX в jQuery
Иллюстрация: Терри МунКакое-то время стандартный способ вызова AJAX с использованием jQuery был довольно простым — с использованием функции $.ajax() :
Выглядит просто, но у этого есть несколько недостатков. метод:
- Чрезмерная вложенность. Функции и события, зависящие от возвращаемых данных AJAX, должны быть заключены в обработчик Success , поскольку AJAX по своей природе асинхронен . В том же духе это снижает читабельность вашего кода.
- Сложность в цепочке и компаундировании. Трудно и чрезвычайно сложно оценивать результаты нескольких запросов AJAX — мы не можем предсказать, сколько времени потребуется для возврата ответа всеми запросами AJAX (каждый из которых выполняется асинхронно).
- Предупреждение об устаревании. Начиная с версии 1.8 и выше, обратные вызовы jqXHR.success() , error и complete официально признаны устаревшими.
К счастью, промисы и отложенные объекты изначально реализованы в методе $.ajax() :
- .done() в качестве замены .успех()
- .fail() вместо .error()
- .always() вместо .complete ()
В соответствии с другим родным jQuery методы, вы можете объединить их в цепочку, т.е.:
Цепочка работает, как обычно
Еще лучше: назначьте $.ajax() метод переменной, для которой вы можете связывать обратные вызовы обещаний. Цепочка всегда была отличительной чертой jQuery, которая позволяет, например, повторно использовать кешированный селектор. В этом случае метод $.ajax() изначально возвращает объект обещания, который мы также можем использовать для цепочки: как сам вызов AJAX, не требуя сложного вложения внутри вызова как таковой ? Хотя это преимущество может показаться незначительным на первый взгляд, оно значительно улучшает читабельность вашего кода, особенно в производственной среде, где ваш код, вероятно, будет загроможден множеством асинхронных вызовов.
Он также позволяет вводить код между самим вызовом AJAX и выполнением обещания, переданного вызовом, что обеспечивает большую гибкость в кодировании.
Другими словами, вы можете видеть, что обещания и отложенные объекты, реализованные начиная с jQuery версии 1.5 и выше, в отношении синхронности выполнения кода сродни всплыванию событий в DOM, прослушиваемых .on() метод.
Множественные вызовы AJAX
Соединение нескольких вызовов AJAX никогда не было проще с помощью промисов. Все, что вам нужно сделать, это прослушать их статус через $.when() .
Цепочка зависимостей запросов AJAX
Вы также можете связать несколько запросов AJAX, например, когда второй вызов AJAX зависит от возвращаемых данных при первом вызове. Допустим, первый вызов извлекает идентификатор сеанса пользователя, и нам нужно передать это значение второму скрипту. Помните, что $.then() возвращает new обещание, которое впоследствии может быть передано в метод $.done() или даже в другой метод $.then ().
Модуляризация запросов AJAX
Чаще всего требуется модульность кода и делегирование одной функции для выполнения динамических запросов AJAX. Как мы должны вызвать вызов AJAX по отдельности и получить доступ к возвращенному промису в этом случае? Это оказывается не просто: просто вернуть объект AJAX после того, как вы сделаете запрос.
Допустим, мы хотим сделать два вызова AJAX, которые в основном используют одни и те же параметры, за исключением параметров data и url :
Больше никакого беспорядочного вложения и повторения $.ajax () метод снова и снова.
Обработка массивов возвращенных отложенных объектов
Иногда вам может понадобиться использовать $.when() на массив отложенных объектов. Примером ситуации может быть: выполнение серии вызовов AJAX (возможно, количество вызовов динамически меняется?), а затем проверка, когда все они будут выполнены. Как это работает?
Есть два варианта:
- Более простой для понимания метод состоит в том, чтобы создать пустой массив, использовать $.each() для выполнения итеративных вызовов AJAX, а затем поместить возвращенное обещание в массив.
- Предпочтительным методом (лично) будет использование . map() для создания объекта, содержащего возвращенные обещания, которые мы затем используем .get() для возврата массива
После этого все просто: просто используйте $.when.apply ($, массив) для оценки всех выполненных вызовов AJAX:
Вы можете видеть, что использование обещаний и отложенного объекта дает беспрецедентное преимущество по сравнению с вложением jqXHR.success обратных вызовов при выполнении итеративных вызовов AJAX, которые следует оценивать как весь.
Конечно, вышеупомянутые промисы и отложенные объекты также можно использовать для методов $.get() и $.post() , которые в основном являются сокращенными функциями для $.ajax () с использованием методов GET или POST.
Написание этой статьи было вдохновлено моим посещением StackOverflow, где довольно часто возникают вопросы, связанные с AJAX на основе jQuery.