Twilio.Sync地图经常无法获得300多个项目

时间:2018-01-11 12:40:21

标签: javascript synchronization twilio

我正在开发Twilio Sync。

我使用地图,插入300多个项目。

要获取所有项目,我调用函数getItems

获取每50项,递归通话获取所有项目。

然后,经常抛出错误。

  1. sync.js抛出异常,消息为Maximum attempt time limit reached
  2. 但是Http状态代码是200。

    1. 异常消息为Rate limit exceeded for read-map-MAPSID
    2. Http状态代码是429。

      这些错误经常发生,但很少成功。

      如何获得稳定所有地图项目。

1 个答案:

答案 0 :(得分:1)

我是Sync的产品负责人。我相信我们以前见过这个问题,可能是下面的问题之一:

  1. 定期致电getItems(而不是依赖"itemUpdated" events),
  2. 过于频繁地呼叫getItems(即每次点击鼠标)或
  3. 分页错误。
  4. 我不知道哪个会影响你最具体,但第二个是最具说明性的。

    经常查询项目(不要这样做):

    $('#something').mouseUp(event => {
      …
      mySyncMap.getItems(/* everything */)
        .then(paginator => {
          displayInUi(paginator.items);
        });
    });
    

    这似乎很无聊,但由于查询没有具体的开始和结束,因此Sync无法使用本地缓存数据。它将再次查询所有内容,这将导致您点击Sync rate limits,特别是“对象读取速率”。由于您看到HTTP 429错误,这可能就是正在发生的事情。

    查询一次,然后分段更新UI。

    在大多数情况下,您不应在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。也许这会有所帮助。

    我希望有所帮助!