我在一个相对简单的parse.com例程中遇到了性能问题:
我们有两个课程,我们想要制作它们的交叉产品。一个类包含用于新对象的样板的单个对象(描述等),另一个类包含可变数据(名称,地点点等)的“大”集(仅1000个对象)。每个新对象也有一些自己的列,而不仅仅是来自父项的数据。
为此,我们对第二个类进行查询并执行每个操作。在每个回调中,我们创建并填充我们的新对象并给它指向其父对象。我们在每个对象上调用save()(使用then()子句进行重试和错误处理)并将返回的promise推送到数组中。最后,我们在save promises数组中的when()promise中返回状态。
我们最初创建了所有对象,然后对它们执行了saveall但是无法从中获得足够好的错误处理 - 所以我们移动到when()时使用promises链进行重试。
麻烦的是,它很慢。它感觉不像nosql数据库的类型应该慢,所以我们责备我们的设计。
将一堆对象从一个类克隆到另一个类的最佳做法是什么?或者是否可以从saveAll失败中获得更好的结果?
我当前的代码看起来像这样:
var doMakeALoadOfObjects = function(aJob,aCaller) {
Parse.Cloud.useMasterKey();
return aJob.save().then(function(aJob) {
theNumTasksPerLoc = aJob.get("numberOfTasksPerLocation");
if (theNumTasksPerLoc < 1) {
theNumTasksPerLoc = 1;
}
var publicJob = aJob.get("publicJob");
return publicJob.fetch();
}).then(function(publicJob) {
var locationList = aJob.get("locationList");
return locationList.fetch();
}).then(function(locationList) {
publicReadACL = new Parse.ACL();
publicReadACL.setPublicReadAccess(true);
publicReadACL.setRoleReadAccess("Admin",true);
publicReadACL.setRoleWriteAccess("Admin",true);
// Can't create a promise chain inside the loop so use this function.
var taskSaver = function(task) {
return task.save.then(function success(){
numTasksMade++;
},
function errorHandler(theError) {
numTimeOuts++;
numTaskCreateFails++;
logger.log("FAIL: failed to make a task for job " + aJob.get("referenceString") + " Error: " + JSON.stringify(theError));
});
};
var taskSaverWithRetry = function(task) {
return task.save().then(function() {
numTasksMade++;
return Parse.Promise.as();
}, function(error) {
logger.log("makeJobLive: FAIL saving task. Will try again. " + JSON.stringify(error));
numTimeOuts++;
return task.save().then(function() {
numTasksMade++;
return Parse.Promise.as();
}, function(error) {
numTimeOuts++;
numTaskCreateFails++;
logger.log("makeJobLive: FAIL saving task. Give up. " + JSON.stringify(error));
return Parse.Promise.as();
});
})
}
for (var j = 0; j < theNumTasksPerLoc; j++) {
var Task = Parse.Object.extend("Task");
var task = new Task();
task.set("column",stuff);
// Can't create a promise chain in the loop so use the function above.
taskSaverArray.push(taskSaverWithRetry(task));
}
return Parse.Promise.when(taskSaverArray);
}).then(function() {
}).then(function() {
// happy happy
},function(error){
// we never land here.
});
}
...“看起来”就像是因为我删除了很多对象创建代码和我们同时做的一些内务处理。我可能也删除了一些变量定义,所以我怀疑它会按原样运行。