聚合铁ajax和异步请求(etag同步和响应处理)



我正在寻找一种行之有效的方法来处理对返回JSON的API端点的异步调用(使用polymer最新的iron-ajax元素)。这些API调用依赖于etag匹配,因此发送的etag与服务器上的etag匹配非常重要。除了在某些情况下,快速连续的API调用可能会导致顺序外的响应(因此可能会使etag不同步),我已经完成了这一部分。还有多个API端点(即不同的URL)。因此,有时,如果使用不同端点的快速连续调用是通过iron-ajax元素启动的,这可能会导致响应处理程序函数出现问题,因为响应处理程序当前会检查ajax元素的URL,以了解如何正确处理响应。因此,如果在接收到第一个调用响应之前,第二个调用覆盖了ajax组件的URL,那么当第一个调用返回时,responseHandler不会正确处理它。也许有一种更好、更可靠的方法可以准确地检查哪个呼叫已返回?

我知道我不是第一个遇到这种情况的人,所以我想知道是否有人能向我展示开明的道路?我认为有一个简单的策略来处理这个问题,也许可以实现调用队列等,但我不确定iron ajax是否有任何内置的东西可以在这方面提供帮助。

一个带有一些示例代码的示例将是绝对惊人的!

如果您依赖于多个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请求,并返回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子句链接在一起。

最新更新