Я разрабатываю Twilio Sync.
Я использую Map, вставляю элементы более чем 300 элементов.
Чтобы получить все элементы, я вызываю функцию getItems
.
Получите на 50 пунктов, рекурсивный вызов получите все предметы.
Затем часто возникает ошибка ниже.
Maximum attempt time limit reached
.Но код состояния Http - 200.
Rate limit exceeded for read-map-MAPSID
.Код состояния Http - 429.
Эти ошибки часто возникают, но редко удаются.
Как я могу получить стабильные все элементы карты.
Я ведущий продукт Sync. Я считаю, что мы видели эту проблему раньше, и это, вероятно, одно из следующих:
getItems
(вместо того, чтобы полагаться на события "itemUpdated")getItems
вызов getItems
(т.е. для каждого щелчка мыши) илиЯ не знаю, что влияет на вас наиболее конкретно, но второе является наиболее показательным.
$('#something').mouseUp(event => {
…
mySyncMap.getItems(/* everything */)
.then(paginator => {
displayInUi(paginator.items);
});
});
Это кажется неоднородным, но поскольку для запроса нет конкретного начала и конца запроса, Sync не может использовать локально кэшированные данные. Он будет запрашивать все снова, что приведет к тому, что вы столкнетесь с ограничениями скорости синхронизации, в частности, "скорость чтения объектов". Поскольку вы видите ошибки HTTP 429, это, вероятно, происходит.
В большинстве случаев вы не должны использовать 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. Возможно, это поможет.
Надеюсь, это поможет!
20/s per object
. Этотobject
означает на карте? Или за элемент карты?