2014-07-13 3 views
0

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

[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.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 , так что это может быть очень простая ошибка где-то.

ответ

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, и вы, возможно, следует перестроить свой метод, возможно, используя один класс и просто маркировка класса объекта по имени или изменение его состояния (развернуто = 0/1), трудно догадаться, что вы пытаетесь выполнить, но ваш путь гарантирует некоторые проблемы.

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

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

+0

Ваше предложение по одному классу и отличному состоянию звучит отлично. Я попробую, но я должен переписать мою клиентскую логику, так что это не мгновенно. – imas145

Смежные вопросы