Worklight JSONStore — жизненный цикл

Среда: Worklight Studio 6.1 в Windows. Я хочу подтвердить наше понимание использования метода JSONStore.init(). Это следует из этого вопроса, который устанавливает, что при вызове init() для повторного открытия магазина мы должны передать те же параметры, что и при инициализации магазина в первый раз.

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

Я ожидаю, что требование состоит в том, что при любом заданном выполнении приложения, использующего коллекции JSONstore, необходимо вызывать init() для каждой коллекции (возможно, вызывая init() со списком коллекций), и что разумная модель состоит в том, чтобы сделать это при запуске приложения. Это основано на моем прочтении документации JSONstore.init.

Пожалуйста, можем ли мы подтвердить, что с этого момента мы можем:

а). свободно используйте такие методы, как JSONStore.get(), без дополнительных вызовов init().

б). если мы снова вызовем init() для уже инициализированной коллекции, побочных эффектов быть не должно.

Симптом, который у нас есть, заключается в том, что иногда второй вызов init() приводит к сообщению об ошибке.

 PROVISION_TABLE_SEARCH_FIELDS_MISMATCH  in worklight.js at line 4556

хотя, насколько мы можем видеть, мы всегда вызываем init(), используя идентичные параметры коллекции.


person djna    schedule 25.03.2014    source источник
comment
Дополнительная информация: кажется, что API ведут себя должным образом при работе в качестве приложения для Android, но не в качестве мобильного веб-приложения. Откроется новый вопрос, если мы сможем изолировать тестовый пример.   -  person djna    schedule 27.03.2014


Ответы (1)


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

Вы определенно можете инициализировать коллекции при запуске и открывать их до конца жизненного цикла приложения, а затем закрывать их, например, при закрытии приложения. Вам не нужно вызывать init при вызове get или любого другого метода JSONStore; как я уже сказал, вам нужно вызывать init только тогда, когда вы используете коллекцию в первый раз или после того, как вы закрыли или уничтожили хранилище (путем вызова WL.JSONStore.closeAll() или WL.JSONStore.destroy()).

Что касается ошибки, которую вы получаете, это, скорее всего, означает, что вы передаете разные поля при втором вызове init, и вы не можете этого сделать, поскольку поля поиска не могут изменяться динамически. Если вы хотите изменить поля поиска, вам сначала нужно удалить эту коллекцию (и потерять данные внутри нее), а затем повторно инициализировать ее с новыми данными.

Чтобы убедиться, что вы можете вызывать init несколько раз (с одними и теми же аргументами), вы можете запустить следующий пример кода:

var collections = {
          people : {
            searchFields : {name: 'string'}
          },
          orders : {
            searchFields: {name: 'string'}
          }
        };

        WL.JSONStore.init(collections)

        .then(function () {
          return WL.JSONStore.init(collections);
        })

        .then(function () {
          return WL.JSONStore.init(collections);
        })

        .then(function () {
          //init called 3 times succesfully
            alert('Multiple inits worked');
        })

        .fail(function (err) {
          //this should not be called
            alert('Multiple inits failed' + err.toString());
        }); 
person Daniel A. González    schedule 25.03.2014