Как обновить свойство объекта с помощью кода Parse Cloud?

Каждый экземпляр объекта Parse Installation в моей базе данных Parse имеет указатель на конкретного пользователя. У меня есть фоновое задание, которое выполняется для каждого пользователя, и в этой части фонового задания я хочу установить для соответствующего пользователя Installation свойство channel равным ["yesPush"] для целей таргетинга push-уведомлений.

Я решил, что сделаю это, запросив конкретный экземпляр Parse.Installation, а затем установив его свойство каналов. Однако, похоже, это не работает. Я пытаюсь следовать рекомендациям в Parse Cloud Code Docs, но это либо не так правильный вариант использования, или я не правильно слежу за ним.

Код:

var installationQuery = new Parse.Query(Parse.Installation);
installationQuery.equalTo('userId', parentUser);

installationQuery.find().then(function(results) {
  return Parse.Object.set('channels', ["yesPush"]);
});

person Ghobs    schedule 27.08.2014    source источник
comment
Где установлен parentUser? почему вы используете вызов return внутри своей находки? Почему вы используете find вместо first, если вы ожидаете не более одного совпадения? Почему вы не вызываете set() сам объект? Почему вы не звоните save() или saveInBackground()?   -  person Timothy Walters    schedule 27.08.2014
comment
parentUser - это аргумент, вызываемый охватывающей функцией, он без проблем используется в разных частях fxn, поэтому я не думаю, что это проблема. Я думал, что здесь нужно использовать возврат, и использование find вместо first было глупой ошибкой. Как мне вызвать set() на объекте?   -  person Ghobs    schedule 28.08.2014


Ответы (1)


Я бы сделал это следующим образом:

// for every User
var userQuery = new Parse.Query(Parse.User);
userQuery.each(function(user) {
  var installationQuery = new Parse.Query(Parse.Installation);
  installationQuery.equalTo('userId', user);

  return installationQuery.first().then(function(installation) {
    installation.set('channels', ['yesPush']);
    return installation.save();
  });
}).then(function() {
  status.success();
}, function(error) {
  status.error(error.message);
});

Функция each() - это то, как вы обрабатываете большие наборы данных в задании. Если вы выполняете внутри него другие асинхронные задачи, вам нужно вернуть их обещание.

Функция first() намного быстрее и проще, если мы ожидаем только одну запись.

Я вызываю set() для фактического объекта installation, возвращенного first().

Я возвращаю save() обещание, чтобы разрешить цепочку обещаний.

person Timothy Walters    schedule 28.08.2014