【问题标题】:Polymer iron-ajax and asynchronous requests (etag sync and response handling)Polymer Iron-ajax 和异步请求(etag 同步和响应处理)
【发布时间】:2015-11-20 20:54:11
【问题描述】:

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

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

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

【问题讨论】:

  • 你作为服务器运行什么??
  • 我在 MongoDB 实例前使用 python-eve rest api (python-eve.org) 运行 python web 服务器。

标签: javascript ajax asynchronous polymer polymer-1.0


【解决方案1】:

如果您依赖于多个 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>

【讨论】:

    【解决方案2】:

    首先 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(array of requests).then(...) 来给你一个有序的响应数组。

    如果您查看 iron-ajax 的源代码,您会看到它如何创建 Iron-request,然后使用它。您也可以这样做,但基于我上面提到的示例。

    如果我误解了,并且您试图确保请求按顺序发出,那么您仍然可以使用 Promise 执行此操作,但不是使用 Promise.all,而是使用 .then 子句一个接一个地链接它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多