我有一个云代码功能,它将Notification对象标记为" read"然后立即查询同一个班级以保留"未读"对象。
问题是最多次,在我之前的未读查询中返回我标记为读取的相同Notification对象,即使这些值已在数据浏览器中更新。
当我从Parse.Promise.when()
更改为Parse.Object.saveAll()
时,这解决了问题,但目前仍不清楚原因。当所有save()
操作完成时,应该解决when promise,因此不会运行最后的"未读"查询,直到他们被标记为已读。
Parse.Object.saveAll(objects)
做Parse.Promise.when(promiseListOfSaves)
没有做什么?
以下每个代码示例。除了保存对象的方式之外,两者之间没有太大区别。
Parse.Cloud.define('markThreadReadAndReturnUnreadCount', function(request, response){
var promiseChain = [];
var Notification = Parse.Object.extend("Notification");
qry = new Parse.Query(Notification);
qry.equalTo('owner', request.user);
qry.equalTo('read', false);
qry.equalTo('messageThreadId', request.params.threadId);
qry.find(null, {useMasterKey: true}).then(function(_notifications){
_.each(_notifications, function(_notification){
notification = new Notification();
notification.id = _notification.id;
notification.set('read', true);
promiseChain.push(notification.save(null, {wait: true}));
});
return Parse.Promise.when(promiseChain);
}).then(function(){
var countUnreadQuery = new Parse.Query(Notification);
countUnreadQuery.equalTo('owner', user);
countUnreadQuery.equalTo('read', false);
countUnreadQuery.find({useMasterKey: true}).then(function(results){
return response.success(results.length);
}
};
});
使用Parse.Object.saveAll();
Parse.Cloud.define('markThreadReadAndReturnUnreadCount', function(request, response){
var saveObjects = [];
var Notification = Parse.Object.extend("Notification");
qry = new Parse.Query(Notification);
qry.equalTo('owner', request.user);
qry.equalTo('read', false);
qry.equalTo('messageThreadId', request.params.threadId);
qry.find(null, {useMasterKey: true}).then(function(_notifications){
_.each(_notifications, function(_notification){
notification = new Notification();
notification.id = _notification.id;
notification.set('read', true);
saveObjects.push(notification);
});
return Parse.Object.saveAll(saveObjects);
}).then(function(){
var countUnreadQuery = new Parse.Query(Notification);
countUnreadQuery.equalTo('owner', user);
countUnreadQuery.equalTo('read', false);
countUnreadQuery.find({useMasterKey: true}).then(function(results){
return response.success(results.length);
}
};
});
答案 0 :(得分:2)
我不确定为什么saveAll
在when
不起作用的情况下有效,但在这种情况下,我希望saveAll
优于when
,原因有两个:< / p>
代码风格,以下两个选项看起来更好:
function save(objects){
return Parse.Promise.when(objects.map(function(object){
return object.save(null, {wait: true});
}));
}
// or
function save(objects){
return Parse.Object.saveAll(objects);
}
性能,当您使用保存数组时,您要为要保存的n
对象发送n
个http请求,这会浪费大量资源,但是当您使用saveAll
您只发送一个请求。
我认为您的第二个代码可以简化为:
...
qry.find(null, {useMasterKey: true}).then(function(_notifications){
_.each(_notifications, function(_notification){
notification.set('read', true);
});
return Parse.Object.saveAll(_notifications);
}).then(function(){
...