Parse SDK saveAll цепочка промисов

Совет с форума разработчиков Parse гласит: "ограничьте saveAll до 75 объектов, если вы не хотите, чтобы saveAll создавал свои собственные пакеты", что по умолчанию составляет 20 объектов. И поместить это в цепочку обещаний.

Мне нужно создать цепочку обещаний saveAll, где я не знаю, сколько обещаний мне нужно.

Как это сделать?

У меня есть массив массивов. Все вспомогательные массивы имеют длину 75. Мне нужно, чтобы все индексы главного массива были saveAll в Promise каждый.

            var savePromises = [];  // this will collect save promises 

            while((partition=partitionedArray.pop()) != null){  
                savePromises.push(Parse.Object.saveAll(partition, {
                    success: function(objs) {
                        // objects have been saved...


                    },
                    error: function(error) { 
                         // an error occurred...
                         status.error("something failed");
                    }
                }));
            }

            return Parse.Promise.when(savePromises);
    }).then(function() {

        // Set the job's success status
        status.success("successful everything");

person CQM    schedule 15.07.2015    source источник
comment
У меня была такая проблема в течение длительного времени, и недавно я начал с библиотеки, чтобы разобраться с ней раз и навсегда - spex. Также поддерживаются, в частности, партии.   -  person vitaly-t    schedule 23.09.2015


Ответы (1)


Хороший способ сделать это — построить цепочку промисов рекурсивно. Если вы уже объединили объекты, которые необходимо сохранить, в пакеты, то часть работы уже выполнена.

// assume batches is [ [ unsaved_object0 ... unsaved_object74 ], [ unsaved_object75 ... unsaved_object149 ], ... ]
function saveBatches(batches) {
    if (batches.length === 0) { return Parse.Promise.as(); }
    var nextBatch = batches[0];
    return Parse.Object.saveAll(nextBatch).then(function() {
        var remainingBatches = batches.slice(1, batches.length);
        return saveBatches(remainingBatches);
    });
}

EDIT. Чтобы вызвать это, просто вызовите его и обработайте обещание, которое оно возвращает...

function doAllThoseSaves() {
    var batches = // your code to build unsaved objects
    // don't save them yet, just create (or update) e.g....
    var MyClass = Parse.Object.extend("MyClass")
    var instance = new MyClass();
    // set, etc
    batches = [ [ instance ] ];  // see? not saved
    saveBatches(batches).then(function() {
        // the saves are done
    }, function(error) {
        // handle the error
    });
}

РЕДАКТИРОВАТЬ 2. В какой-то момент транзакции, которые вы хотите выполнить, не уложатся в предельный пакет уровня бесплатного пользования, а их распространение (каким-то образом) не уложится в лимит времени ожидания.

Я боролся с похожей проблемой. В моем случае это редкая миграция с участием администратора. Достаточно редкий и невидимый для конечного пользователя, чтобы заставить меня лениться в отношении надежного решения. Теперь это другой вопрос, но несколько идей для надежного решения могут быть такими:

  1. см. underscore.js _.throttle(), работающий от клиента, чтобы распределить транзакции во времени
  2. запустите свой собственный сервер узла, который регулирует вызовы в анализе аналогично (или аналогично) _.throttle().
  3. запланированное задание синтаксического анализа, которое запускается часто, откусывая понемногу (мой случай связан с файлом импорта, поэтому я могу сначала быстро сохранить его, открыть его в задании, подсчитать количество объектов, которые я создал на данный момент, отсканируйте соответственно в файл и сделайте еще одну партию)
  4. мое текущее (очень глупое, но функциональное) решение: пользователь-администратор вручную запрашивает N небольших пакетов, заботясь о том, чтобы эти запросы («один Миссисипи, два Миссисипи, ...») между нажатиями кнопок
  5. не дай бог — наймите еще один бэкенд, помня, что мы обычно получаем то, за что платим, а синтаксический анализ — даже на бесплатном уровне — довольно приятный.
person danh    schedule 15.07.2015
comment
У меня есть цикл while, который создает промисы, что вы об этом думаете. Это не работает, как ожидалось, хотя - person CQM; 15.07.2015
comment
Кроме того, можете ли вы привести пример того, как я могу вызвать ваш метод из функции? мне все еще нужно мое заявление then - person CQM; 15.07.2015
comment
Вернусь к моему столу через 30 минут. Пересмотрю тогда. - person danh; 15.07.2015
comment
Хорошо, я просто сделал saveBatches(partitionedArray);, а также попытался `вернуть saveBatches (partitionedArray);` перед моим оператором then. Это записывает только 21 строку в моей таблице. попытка в моем ОП пишет 189 строк. И до того, как я использовал цепочку промисов, я достиг предела бесплатного уровня в 1780 строк. Мне нужно достичь 3000+, и цепочка обещаний должна быть решением, поскольку я не могу сделать одно массивное saveAll. поэтому я пытаюсь разбить его таким образом - person CQM; 15.07.2015
comment
Я попытался уточнить, представив пример вызова. Слишком много сохранений в конечном итоге истечет по тайм-ауту... Вероятно, 3k+ - это слишком много. Вам нужно будет ограничить создание. - person danh; 15.07.2015
comment
@dahn как мне задушить творение? - person CQM; 15.07.2015
comment
да, я достиг того же предела, что и до того, как попытался использовать обещания. Как я могу отложить выполнение промиса? - person CQM; 15.07.2015
comment
Что бы ни двигало его, просто нужно делать меньше. - person danh; 15.07.2015
comment
Мне нужно написать 3024 (или больше) вещей, думаю, мне просто понадобится другой стек вместо Parse (или обработка на стороне клиента) - person CQM; 15.07.2015
comment
Я чувствую твою боль, брат (или сестра). Отредактировано снова с моими мыслями. - person danh; 15.07.2015