Кажется, pouchdb сохраняет, но не сохраняет - PullRequest
0 голосов
/ 09 января 2019

Я работаю над приложением Cordova. Я начал использовать pouchdb из-за недостатка места в локальном хранилище. Я публикую json-данные, которые я сохранил, в локальном хранилище на pouchdb. Это как документ был создан. Но документ не встречается. Возвращает 0 строк, когда я использую функцию «Извлечь все документы».

create: function (item) {
            myApp.db.post(item).then(function (response) {
                console.log("Response id " + response.id + " item " + item);
            }).catch(function (err) {
                console.log(err.name === 'conflict' ? "Conflict occurred - possible duplicate " : "Error " + err);
            });
  },
    loadData: function (callback) {
        myApp.db.allDocs({ include_docs: true, attachments: true }, function (err, response) {
            if (err) console.log(err);
            var rows = response.rows;
            for (var i = 0; i < rows.length; i++) {
                console.log(rows[i].doc);
                alert(JSON.stringify(rows[i].doc));
                //var taskItem = myApp.services.tasks.createTaskElem(rows[i].doc);
                //if (rows[i].doc.completed)
                //    myApp.services.tasks.addToCompletedList(taskItem);
                //else myApp.services.tasks.addToPendingList(taskItem);
            }
        });
    }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

1 Ответ

0 голосов
/ 09 января 2019

Я полагаю, что вас обманул асинхронный характер Javascript. Пока ваша команда post обрабатывается, Javascript переходит к следующей задаче ... allDocs ... и не находит ваши данные, потому что они все еще записываются в PouchDB.

Если вы заметили, каждый из примеров документа PouchDB API имеет 3 вкладки, позволяющие выбрать альтернативы Callback, Promise или Async / Await. Я уверен, что, как только вы это поймете, вы обнаружите, что Async / Await - , безусловно, - лучший способ работы с PouchDB.

Итак, пожалуйста, попробуйте следующее, и дайте мне знать, как вы поживаете:

/*  Function to instantiate a new random JSON record */
const item = () => {
  return {
    _id: `Thing_${parseInt(1000*Math.random(), 10)}`,
    stuff: ' silly random remark ',
  }
};

/* Function to 'put', then retrieve, records from PouchDB */
const dbTest = async () => { // "async" advises JavaScript to expect (otherwise illegal) 'await' statements
  console.log(`
    Start ...
    `);
  try {
    /* Remember the item ID */
    const rndItemId = item();

    /* Store the random item in PouchDB */
    const response = await myapp.db.put(rndItemId); // Do NOT return until 'put' is complete

    /* Log the response from PouchDB */
    console.log(`response for <${rndItemId._id}> ....\n${JSON.stringify(response, null, 2)}`);

    /* Get back all the random items we 'put' in the Pouch so far */
    const result = await myapp.db.allDocs({ // Do NOT return until 'allDocs' is complete
      include_docs: true,
      attachments: true,
      startkey: 'Thing_0',
      endkey: 'Thing_999',
    });

    /* Log the result from PouchDB */
    console.log(`result ....\n${JSON.stringify(result, null, 2)}`);

  } catch (err) {
    console.log(err);
  }
  console.log(`
    ... done!
    `);
};
/* Call the above function */
dbTest();
/* Call it again */
dbTest();

Краткое примечание: обратите внимание на использование put вместо post! Пожалуйста, прочитайте 12 профессиональных советов для лучшего кода с PouchDB .

...