簡體   English   中英

聚合物iron-ajax和異步請求(etag同步和響應處理)

[英]Polymer iron-ajax and asynchronous requests (etag sync and response handling)

我正在尋找一種經過驗證的方法來處理返回JSON的API端點的異步調用(使用聚合物最新的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>

首先,鐵-ajax在皮膚下使用鐵請求並返回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-request,然后使用它。 您可以這樣做,但基於我上面提到的示例。

如果我誤解了,並且你試圖確保請求按順序發出,那么你仍然可以使用Promises,但是不是使用Promise.all,而是用一個接一個的.then子句鏈接它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM