Dex ie JS Вложенные коллекции, не разрешающиеся в цепочке обещаний - PullRequest
0 голосов
/ 27 февраля 2020

Я работал с Dex ie JS для управления хранилищем данных IndexDB и теперь хочу синхронизировать c хранилище данных с удаленной базой данных. Проблема, с которой я столкнулся, заключается в том, что я хочу вложить все реляционные / дочерние записи в соответствующие родительские записи в коллекции, а затем отправить всю группу / список на удаленный сервер, используя некоторые значения AJAX.

* 1002. * На практике я вижу, что дочерние записи отсутствуют во время их отправки на удаленный сервер. Тем не менее, я вижу их в console.log (). Я знаю, что это потому, что console.log () получает реальные данные гораздо позже, чем когда данные передаются удаленно. Я также знаю, что это общая проблема с цепочками обещаний, но я почему-то не могу ее решить.

Вот что у меня есть.

function PushRemote(items, modelName) {

    console.log(items);

$.ajax({
   type: 'POST',
   url: '/' + modelName + '/AsyncSave',
   contentType: 'application/json; charset=utf-8',
   dataType: 'json',
   data: JSON.stringify(DataTransferItemList),
   success: function (response) {
       iDB.open().then(function () {
               return iDB.table(modelName).update(response, { isNotSynced: "false" });
       });
   },
   error: function (response) {
       console.error(response);
   }
});
}

function PushTableToRemote(modelName) {
  iDB.transaction('rw',
    iDB.Comments,
    iDB.CommentRatings,
    iDB.Posts,
    iDB.PostRatings,
    iDB.Reviews,
    () => {
        iDB.table(modelName).where({ isNotSynced: "true" }).toArray(items => {

            items.forEach(item => {

                if (modelName == 'Comments') {
                    iDB.CommentRatings.where({ CommentId: item.CommentId }).toArray(c => item.CommentRatings = c);
                }

                if (modelName == 'Posts') {
                    iDB.PostRatings.where({ PostId: item.PostId }).toArray(p => item.PostRatings = p);
                }

            })

            return items;
        })
        .then(items => {
            if (items && items.length > 0) {
                PushRemote(item, modelName);
            }
        });
    });
}

pushTableToRemote('Comments');

1 Ответ

0 голосов
/ 28 февраля 2020

Хорошо, получается, что если вы не можете go пройти через цепочку обещаний, тогда вы go пройдете по цепочке обещаний. ;)

Закончилась реализация spawn() и yield с функцией генератора вместо цепочки обещаний (https://dexie.org/docs/Simplify-with-yield.html). Это было намного проще, по крайней мере для меня. И работал как шарм. Ваш пробег может варьироваться.

function PushTableToRemote(modelName) {

spawn(function* () {

    var items = yield iDB.table(modelName).where({ isNotSynced: "true" }).toArray();

    if (items && items.length > 0) {

        if (modelName == 'Comments') {
            for (var i = 0; i < items.length; i++) {
                var CommentRatings = yield iDB.CommentRatings.where({ CommentId: items[i].CommentId }).toArray();
                items[i].CommentRatings = CommentRatings;
            }
        }

        if (modelName == 'Posts') {
            for (var i = 0; i < items.length; i++) {
                var PostRatings = yield iDB.PostRatings.where({ PostId: items[i].PostId }).toArray();
                items[i].PostRatings = PostRatings;
            }
        }

        PushRemote(items, modelName);
    }
});
}
...