Функция Parse Cloud завершается с ошибкой 141.

Что я пытаюсь сделать, так это то, что когда я вызываю эту облачную функцию (deploy), она сначала удаляет все данные из toClass, затем перебирает объекты в fromClass, копирует и сохраняет их в toClass. Когда он сохраняет объект, он также удаляет его из fromClass. Проще говоря, перемещайте объекты из класса в другой. Вызов этой функции на клиенте

[PFCloud callFunctionInBackground:@"deploy" withParameters:@{@"toClass": kTilrClassUpdates, @"fromClass": kTilrClassPrototypeUpdates} block:^(id object, NSError *error) {
    if (error) {
        [self failed];
    } else {
        [self succeeded];
    }
}];

Будет напечатано это сообщение об ошибке в журнале клиента: Error: undefined (Code: 141, Version: 1.2.19)

Вот код для Parse Cloud:

Parse.Cloud.define("deploy", function(request, response) {
    var query = new Parse.Query(request.params.toClass);
    query.find({
        success: function(results) {
            for (var i = 0; i < results.length; ++i) {
                console.log(results[i]);
                results[i].destroy({
                    success: function(object) {

                    },
                    error: function(object, error) {
                        response.error(error);
                    }
                });
            }
        },
        error: function() {
            response.error(error);
        }
    });
    var query2 = new Parse.Query(request.params.fromClass);
    query2.find({
        success: function(results) {
            for (var index = 0; index < results.length; ++index) {
                var UpdateInfoClass = Parse.Object.extend(request.params.toClass);
                var updateInfo = new UpdateInfoClass();
                for (var k in results[index]) {
                    updateInfo.set(k, results[index][k]);
                }
                console.log(updateInfo);
                updateInfo.save(null, {
                    success: function(updateInfo) {
                        results[index].destroy();
                        if (index == results.length - 1) {
                            response.success();
                        }
                    },
                    error: function(updateInfo, error) {
                        response.error(error);
                    }
                });
            }
        },
        error: function() {
            response.error(error);
        }
    });
});

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


person Sami    schedule 13.07.2014    source источник


Ответы (1)


Есть несколько разделов, которые могут гарантировать вам проблемы: Не ставя под сомнение ваш дизайн:

1) запросы не связаны друг с другом и будут выполняться одновременно

2) вы не можете использовать

for (var k in results[index]) {
    updateInfo.set(k, results[index][k]);
}

копировать свойства с одного объекта на другой. Вам нужно вызвать JSON.stringify(results[index]), чтобы получить стандартный массив. Вы должны установить значения, подобные request.object.set(fiedlName, value) .

3) «индекс» не будет правильно распространяться в подблок - зарегистрируйте его в консоли, и вы увидите, потому что эти запросы также не связаны цепочкой, и он будет выполняться сразу, поэтому индекс будет иметь какое-то значение или последнее, потому что это быстро

Однако дизайн вашего метода вызывает сомнения:

База данных при разборе немного отличается от обычной базы данных sql, и вам, возможно, следует перепроектировать свой метод, возможно, используя один класс и просто пометив класс объекта по имени или изменив их состояние (deployed = 0/1), трудно догадаться, что вы пытаюсь выполнить, но ваш способ гарантирует некоторые проблемы.

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

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

person PetrV    schedule 13.07.2014
comment
Ваше предложение об одном классе и другом состоянии звучит великолепно. Я попробую, но мне нужно переписать логику на стороне клиента, чтобы это не было сделано мгновенно. - person Sami; 13.07.2014