在javascript

时间:2017-04-18 18:47:07

标签: javascript polymer

这可能是一个愚蠢的问题,但无论如何我都在问,我有一个关于等待回调的问题。

我在我的网站开发项目中使用Polymer。在我的一个页面中,我有一个循环,在循环中加载一个元素:

loop
   "element-a"
end loop

我从数据库中获取数据和" element-a"从数据库查询结果中填充。 我只想加载另一个"元素-a"曾经"元素-a"已完成加载。

现在,我通过使用强制延迟:     sleepStupidly(微秒);     函数sleepStupidly(usec)     {     var endtime = new Date()。getTime()+ usec;     while(new Date()。getTime()< endtime);     }

但我需要一个更好的方法,任何建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

正如sheriffderek在评论中指出的那样,promises或jQuery的$ .ajax()。success()方法可能是完成这项工作的最佳工具。此外,也可以使用良好的ol'递归。下面是如何在聚合物(v1)组件中使用这些组件的示例。

<dom-module id="example-component">
    <template></template>
    <script>
        Polymer({
            is:"example-component",
            properties: {
                //...
            },
            fetchIndex: 0,
            idsToFetch: [1, 2, 3, 4],
            elementData: [],
            ready: function () {
                this.loadElement(this.idsToFetch[this.fetchIndex]);
            },
            loadElement: function(idToFetch) {
                var self = this;        // Create a reference for the ".done()" method to use when it fires
                $.ajax({
                    url: "http://example.com/getdata",
                    data: {"idToFetch": idToFetch}
                }).done(function (data) {           // This will fire after the response is received, which is where you call the next
                    self.elementData.push(data);    // Save the response data
                    self.fetchIndex++;                                      // Move to the next element
                    if (self.fetchIndex < self.idsToFetch.length) {         // If there's more to fetch
                        self.loadElement(self.idsToFetch[self.fetchIndex]); // Recursively call the same method
                    }
                }).always(function(data){                                   // Optional
                    console.log("Fetch complete for ID: " + idToFetch);
                }).error(function (error){                                  // Optional
                    console.log(error)
                });
            }
        })
    </script>
</dom-module>

总之,在Polymer的loadElement()处理程序上调用ready()方法,并为它提供第一个启动提取的元素。在loadElement()内,进行获取以获取传入的元素ID的数据。一旦获取为.done()(首选,但类似于.success()),递归调用{{1再次使用方法并为其提供列表中的下一个元素。这将以递归方式继续,直到loadElement()值等于fetchIndex数组的长度。