Worklight JSON Store, можем ли мы получить условия гонки?

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 при нормальном запуске (без пошагового выполнения в отладчике) мы не получаем сообщений об ошибках, но вставляется только одна запись - действительно, как если бы был сделан снимок исходного «пустого» хранилища, и каждое добавление работает с этой «пустой» копией .

Написав это, я теперь почти убежден, что описанный выше шаблон кодирования уязвим для своего рода гонки и что лучший подход — создать список документов, которые нужно добавить, и вставить их за одну операцию.


person djna    schedule 29.03.2014    source источник


Ответы (1)


Более подробный ответ будет позже, но теперь я знаю, что это

описанный выше шаблон кодирования уязвим для своего рода гонки, и что лучший подход - создать список документов, которые нужно добавить, и вставить их за одну операцию.

правда. В браузере JSONStore требует, чтобы мы дождались результата одного запроса, прежде чем выдавать другой. Рекомендуемый подход

var dataToAdd = buildArrayOfDataToAdd(responseFromServer);
var dataToReplace = buildArrayOfDataToReplace(responseFromServer);

jsonstore.add( dataToAdd ).then( function() { jsonstore.replace( dataToReplace); })
person djna    schedule 30.03.2014