这可能是一个愚蠢的问题,但无论如何我都在问,我有一个关于等待回调的问题。
我在我的网站开发项目中使用Polymer。在我的一个页面中,我有一个循环,在循环中加载一个元素:
loop
"element-a"
end loop
我从数据库中获取数据和" element-a"从数据库查询结果中填充。 我只想加载另一个"元素-a"曾经"元素-a"已完成加载。
现在,我通过使用强制延迟: sleepStupidly(微秒); 函数sleepStupidly(usec) { var endtime = new Date()。getTime()+ usec; while(new Date()。getTime()< endtime); }
但我需要一个更好的方法,任何建议都会有所帮助。
答案 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
数组的长度。