2014-09-20 2 views
0

Моя проблема, по-видимому, очень распространена. У меня есть куча пользователей и вы хотите обновить свою рейтинговую позицию в соответствии с их скорингом.Сохранение объектов в запросе с помощью Parse.com ограничено первыми рядами?

Итак, я создал функцию CloudCode, которую я вызываю, чтобы обновить позиции. Я делаю запрос и заказываю его элементы по их «скорингу». После этого я получаю каждый элемент один за другим, и я обновляю их значение «позиция».

Код довольно прост:

Parse.Cloud.define("update_ranking", function(request, response) { 
    query = new Parse.Query("Scoring"); 
    query.descending("scoring"); 
    query.find({ 
     success: function(results) { 
      for(var i = 0; i < results.length; ++i) { 
       a = results[i]; 
       console.log("Position of " + a.get("name") + ": " + a.get("position") + ", new position: " + i); 
       a.set("position", i + 1); 
       a.save(); 
       // a.save(null, { 
       // success: function(a) { 
       //  console.log("Posicion de " + a.get("name") + ": " + a.get("position")); 
       //  a.set("position", i); 
       //  a.save(); 
       // }, 
       // error: function(a, error) { 
       //  console.log('No se pudo guardar el objeto con el error: ' + error.message); 
       // } 

       // }); 
      } 
      response.success('All players updated'); 
     } 
    }); 
}); 

Мое удивление, что только три флиртует элементы в запросе получить их позиции обновляются. Остальные элементы остаются в ddbb с одинаковым положением.

Если я вижу в журнале консоли:

I2014-09-20T11:37:51.331Z] Position of Fallen: 2, new position: 2 
I2014-09-20T11:37:51.333Z] Position of Paco: 1, new position: 3 
I2014-09-20T11:37:51.334Z] Position of Pepe: 19, new position: 6 
I2014-09-20T11:37:51.334Z] Position of Dime: 12, new position: 1 
I2014-09-20T11:37:51.334Z] Position of Otto: 14, new position: 12 
I2014-09-20T11:37:51.336Z] Position of Rick: 16, new position: 11 
I2014-09-20T11:37:51.337Z] Position of Charles: 17, new position: 15 

это действительно показывает, что я получаю все элементы в базе данных, и что их позиции должны быть udpated соответственно. Но после a.save() и загляните в ddbb, обновятся только первые три элемента.

Это имеет смысл ???

ответ

1

Есть несколько возможных причин:

  • операция сохранения() является асинхронной, но вы фактически закончить функцию преждевременно response.success.
  • Если есть много экономит, вы могли бы поразить предел Burst

В любом случае, помещая все объекты, которые будут сохранены в массиве, затем вызвать Parse.Object.saveAll, следует позаботиться о его:

var toBeSaved = []; 

for(var i = 0; i < results.length; ++i) { 
    a = results[i]; 
    a.set("position", i + 1); 
    toBeSaved.push(a); 
} 

Parse.Object.saveAll(tobeSaved, { 
    success: function() { 
     response.success('All players updated'); 
    }, error: function (err) { 
     // handle error 
    } 
}); 
+0

Спасибо, Том, это была проблема. Я уже решил, вытащив response.success, но получил ошибку в журнале, и ваше решение решило все. Кстати, сколько экономит, по вашему мнению, может привести к ограничению всплеска? –

+0

Зависит от вашего плана. См. Больше здесь: https://www.parse.com/questions/burst-limit –

+0

Спасибо, Том, но я не уверен, сколько запросов будет выполнять моя функция javascript. Предположим, у нас есть 1000 игроков, saveAll будет одним ударом, или это произвело бы 1000 хитов? –

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