Полимерный железо-аякс и асинхронные запросы (синхронизация etag и обработка ответов)
Я ищу проверенный и верный способ обработки асинхронных вызовов к конечным точкам API, возвращающим JSON (используя последнюю версию полимера элемента iron-ajax). Эти вызовы API основаны на сопоставлении etag, поэтому важно, чтобы отправленный etag совпадал с отправленным на сервере. У меня эта часть работает, за исключением определенных обстоятельств, когда быстрые вызовы API-интерфейса могут привести к ответу вне последовательности (и, следовательно, могут вызвать несинхронизацию etag). Есть также несколько конечных точек API (т.е. разные URL). Таким образом, иногда, если быстрые последовательные вызовы с использованием разных конечных точек инициируются с помощью элемента iron-ajax, это может вызвать проблемы для функции обработчика ответа, поскольку обработчик ответа в настоящее время проверяет URL-адрес элемента ajax, чтобы узнать, как правильно обрабатывать ответ. Следовательно, если второй вызов перезаписывает URL-адрес компонента ajax до получения ответа на первый вызов, когда первый вызов возвращается, responseHandler не обрабатывает его соответствующим образом. Возможно, есть намного лучший и надежный способ проверить, какой именно звонок вернулся?
Я знаю, что я не первый, кто сталкивается с этим сценарием, поэтому мне интересно, может ли кто-нибудь там показать мне просветленный путь? Я думаю, что есть простая стратегия для решения этой проблемы, возможно, реализация очереди вызовов и т. Д., Но я не уверен, что в Iron-Ajax есть что-то встроенное, что могло бы помочь в этом отношении.
Пример с некоторым примером кода был бы просто потрясающим!
2 ответа
Если вы зависите от нескольких конечных точек API, у меня будет отдельный iron-ajax
элемент для каждого из них, чтобы они не давили друг на друга, если URL-адреса меняются (через привязку данных или что-то в этом роде):
<iron-ajax id="cats" url="https://api.example.com/cats" handle-as="json"></iron-ajax>
<iron-ajax id="dogs" url="https://api.example.com/dogs" handle-as="json"></iron-ajax>
Генерация запросов и использование Promise.all()
ждать завершения обоих запросов:
<script>
Polymer({
is: 'my-element',
...,
fetchPets: function () {
var catsRequest = this.$.cats.generateRequest();
var dogsRequest = this.$.dogs.generateRequest();
Promise.all([catsRequest.completes, dogsRequest.completes])
.then(function (requests) {
var cats = requests[0].response;
var dogs = requests[1].response;
// do whatever you want from here...
alert(cats.concat(dogs));
});
}
})
</script>
Во-первых, iron-ajax использует iron-request под кожей, и это возвращает Promise.
Я думаю, что вы пытаетесь достичь того, что с последовательностью последовательных вызовов вы можете иметь одинаковый порядок ответов, несмотря на то, что все они работают, возможно, параллельно.
В этой статье приведен пример этого с набором глав из истории http://www.html5rocks.com/en/tutorials/es6/promises/
В статье приводится онлайн-пример здесь: http://www.html5rocks.com/en/tutorials/es6/promises/async-best-example.html
По сути, он выполняет Promise.all(массив запросов).then(...), чтобы получить упорядоченный массив ответов.
Если вы посмотрите на исходный код iron-ajax, вы увидите, как он создает запрос iron, а затем использует его. Вы можете сделать то же самое, но на основе примера, на который я указал выше.
Если я неправильно понял, и вы пытаетесь обеспечить последовательное выполнение запросов, вы все равно можете сделать это с помощью Promises, но вместо использования Promise.all вы будете связывать их с помощью предложений.then один за другим.