我正在开发Twilio Sync。
我使用地图,插入300多个项目。
要获取所有项目,我调用函数getItems
。
获取每50项,递归通话获取所有项目。
然后,经常抛出错误。
Maximum attempt time limit reached
。但是Http状态代码是200。
Rate limit exceeded for read-map-MAPSID
。Http状态代码是429。
这些错误经常发生,但很少成功。
如何获得稳定所有地图项目。
答案 0 :(得分:1)
我是Sync的产品负责人。我相信我们以前见过这个问题,可能是下面的问题之一:
getItems
(而不是依赖"itemUpdated" events),getItems
(即每次点击鼠标)或我不知道哪个会影响你最具体,但第二个是最具说明性的。
$('#something').mouseUp(event => {
…
mySyncMap.getItems(/* everything */)
.then(paginator => {
displayInUi(paginator.items);
});
});
这似乎很无聊,但由于查询没有具体的开始和结束,因此Sync无法使用本地缓存数据。它将再次查询所有内容,这将导致您点击Sync rate limits,特别是“对象读取速率”。由于您看到HTTP 429错误,这可能就是正在发生的事情。
在大多数情况下,您不应在UI事件处理程序中使用getItems()
。相反,在初始化后使用本地集合来存储查询的项目:
let everything = {}
let pageHandler = function(paginator) {
paginator.items.forEach(function(item) {
everything[item.key] = item.value;
});
if (paginator.hasNextPage) {
return paginator.nextPage().then(pageHandler);
} else {
drawUiWith(everything)
return null;
};
map.getItems({ from: 'myKey', order: 'asc' })
.then(pageHandler)
.catch(function(error) {
console.error('Map getItems() failed', error);
});
...并在项目更改时重绘。
map.on('itemUpdated', event => {
if (! event.isLocal) # echo suppression, perhaps
everything[event.item.key] = item.value;
drawUiWith(everything);
});
更高效的是拥有drawOneItem
功能,但有时这是不切实际的。
如果没有看到你的代码,无限循环是一个很难诊断的错误,但这不是一个不常见的错误。我们在最新的SDK文档中添加了code snippet for paging over map items。也许这会有所帮助。
我希望有所帮助!