Javascript 如何在循环中查询以从类中获取所有数据
我有一个类(目前)有1567个对象。它们是我从网站的RSS源解析的文章的URL、标题和发布日期。云作业是周期性的,因此对象不断增加。虽然我在beforesave中检查唯一性,但有时会出现一些重复项,大约10%的对象是重复的 我一直在尝试做一项工作来删除这些重复项,并想做一个查询逻辑,可以一次获得所有对象。查询的最大限制为1000。我引用了,并试图将其转换为JavaScript云代码Javascript 如何在循环中查询以从类中获取所有数据,javascript,android,parse-platform,Javascript,Android,Parse Platform,我有一个类(目前)有1567个对象。它们是我从网站的RSS源解析的文章的URL、标题和发布日期。云作业是周期性的,因此对象不断增加。虽然我在beforesave中检查唯一性,但有时会出现一些重复项,大约10%的对象是重复的 我一直在尝试做一项工作来删除这些重复项,并想做一个查询逻辑,可以一次获得所有对象。查询的最大限制为1000。我引用了,并试图将其转换为JavaScript云代码 Parse.Cloud.job("DeleteDuplicate", function(request, stat
Parse.Cloud.job("DeleteDuplicate", function(request, status) {
var query = new Parse.Query(NewsArticle);
var allObjectArray= [];
var limit = 1000;
var skip = 0;
var repeat = true;
query.limit(limit);
query.skip(skip);
do{
query.find({
success: function(results) {
allObjectArray.push(results.concat());
if(results.length === limit){
skip = skip+limit;
query.skip(skip);
repeat = true;
console.log("true");
}else{
repeat = false;
console.log("false");
}
console.log("Successfully retrieved " + results.length);
},
error: function(error) {
alert("Error: " + error.code + " " + error.message);
status.error("Error: " + error.code + " " + error.message);
}
});
}while(repeat);
status.success("final length "+allObjectArray.length);
});
代码失败,作业状态为“无法连接到云代码”。我认为它进入无限循环,并在2-3分钟后超时。如果有人能帮忙,那就太好了
编辑:可以使用承诺帮助吗
编辑2:正在尝试承诺-
Parse.Cloud.job("jobFindAll", function(request, status) {
var query = new Parse.Query(NewsArticle);
var allObjectArray= [];
var limit = 1000;
var skip = 0;
var repeat = false;
query.limit(limit);
query.skip(skip);
var promiseList = [];
console.log("in job");
query.find().then(function(results) {
console.log("results.length "+results.length);
allObjectArray = results.slice();
console.log("allObjectArray.length "+allObjectArray.length);
if(results.length === limit){
console.log("smaller");
skip = skip+limit;
do{
console.log("first repeat = "+repeat);
promiseList.push(functionFindAll(allObjectArray, limit, skip));
console.log("promiseList - "+promiseList);
repeat = promiseList[promiseList.length-1];
console.log("looping repeat = "+repeat);
}while(repeat);
return Parse.Promise.when(promiseList);
}else{
console.log("longer");
}
}).then(function(){
console.log("in then");
status.success("final length "+allObjectArray.length);
}, function(error) {
status.error("Error: " + error.code + " " + error.message);
}
);
});
function functionFindAll(allObjectArray, limit, skip){
var returnPromiseList = [];
var query_new = new Parse.Query(NewsArticle);
query_new.limit(limit);
query_new.skip(skip);
query_new.find().then(function(results) {
console.log("function results.length "+results.length);
if(results.length === limit){
skip = skip+limit;
query.skip(skip);
allObjectArray.push(results.concat());
console.log("true in function");
return Parse.Promise.as(true);
}else{
allObjectArray.push(results.concat());
return Parse.Promise.as(false);
console.log("false in function");
}
},
function(error) {
console.log("Error: " + error.code + " " + error.message);
return Parse.Promise.as("ERROR!");
}
);
console.log("below "+allObjectArray.length);
}
现在代码没有输入查询\u new.find()。函数中的日志消息不会直接显示,而是直接显示消息“below…”。解析中的所有JS调用都是异步的,因此您的函数正在生成无限多线程(即使是同步的,您的查询。跳过(skip)
将需要进入while循环,而不是在它之前
尝试将查询移出到它自己的函数,该函数在成功时递归调用,直到您读取了所有对象。您应该能够调整此答案中的代码,这是针对一个类似的问题:以下代码将找到类中的所有项,它不使用skip,因为parse.com有另一个异常的限制调用“无法跳过超过10000个项目”
。它使用objectId跳过
Parse.Cloud.job("findAll", function(request, status) {
var result = [];
var processCallback = function(res) {
result = result.concat(res);
if (res.length === 1000) {
process(res[res.length-1].id);
return;
}
// do something about the result, result is all the object you needed.
status.success("final length " + result.length);
}
var process = function(skip) {
var query = new Parse.Query("NewsArticle");
if (skip) {
console.log("in if");
query.greaterThan("objectId", skip);
}
query.limit(1000);
query.ascending("objectId");
query.find().then(function querySuccess(res) {
processCallback(res);
}, function queryFailed(reason) {
status.error("query unsuccessful, length of result " + result.length + ", error:" + error.code + " " + error.message);
});
}
process(false);
});
非常感谢您的评论。我重试了一次,但遇到了一个问题。代码输入了if,但无法再次调用作业。日志显示-结果:最终长度1000 I2014-05-01T19:31:12.018Z]在作业I2014-05-01T19:31:12.878Z]在查询I2014-05-01T19:31:12.878Z]在ifThanks中感谢您的回复。检查此项。我获得了成功/错误信息未调用
错误。块if(跳过)缺少一个
}
。NewsArticle来自何处?为什么不在引号中?NewsArticle是我在顶部声明的一个实例,因为它也被其他一些作业使用(工作正常)。var NewsArticle=Parse.Object.extend(“NewsArticle”);
我认为它现在正在查询正确的数字,但没有添加到结果数组。日志在此文件中。slice()是否有帮助?抱歉,忘记了分配,已更新。result=result.concat(res)
不,我不这么认为。解析有很多恼人的限制。它很容易开始,但一旦你认真使用它,它开始变得令人沮丧。你可以尝试编写一个云函数来处理结果,用httprequest从这个作业调用它。或者在这个作业中进行处理,然后“httprequest在云文件中将结果保存为csv/json”。