Worklight 6.1 на Windows (коллега) и Mac (я), создание гибридного приложения, предназначенного для устройства Android, но для ускорения разработки мы проводим начальное тестирование в качестве мобильного веб-приложения в браузере Chrome на настольном компьютере.
Мы получаем странный симптом, который я пытаюсь свести к воспроизводимому тестовому примеру. Я думаю, что вижу разное поведение, когда вхожу в отладчик и просто позволяю ему работать. Прежде чем идти дальше, я хочу проверить, может ли определенный шаблон кодирования быть причиной симптома.
Фундаментальный вопрос: должны ли мы ждать разрешения промиса, возвращенного запросом JSONSTore для действия над коллекцией, прежде чем выдавать другой запрос? дополнительные пояснения ниже.
Общая цель состоит в том, чтобы загрузить некоторые данные в JSONStore с некоторыми интеллектуальными действиями по замене/объединению, если запись уже существует. Псевдокод:
for each record retrieved from back-end
if ( record already present in Store )
do some data merging
replace record
else
add record
Код приложения на самом деле работает так, просто учитывая случай с add(), проблема проявляется, когда хранилище пусто, нужно добавить все записи
for each record to add
addPromise = store.get().add(record);
listOfPromises.insert(addPromise);
examine the list of promises recording any errors
То есть нет «ожидания» завершения добавления перед отправкой следующего запроса на добавление. Следовательно, по сути, мы инициировали набор дополнений «параллельно», что бы это ни значило в JavaScript в Chrome.
Код работает нормально, ошибок нет. На устройстве Android работает надежно. В Chrome при нормальном запуске (без пошагового выполнения в отладчике) мы не получаем сообщений об ошибках, но вставляется только одна запись - действительно, как если бы был сделан снимок исходного «пустого» хранилища, и каждое добавление работает с этой «пустой» копией .
Написав это, я теперь почти убежден, что описанный выше шаблон кодирования уязвим для своего рода гонки и что лучший подход — создать список документов, которые нужно добавить, и вставить их за одну операцию.