如何在循环中查询以从类中获取所有数据

时间:2014-05-01 15:02:05

标签: javascript android parse-platform

我有一个(当前)1567个对象的类。它们是我从网站的RSS源解析的文章的网址,标题和发布日期。云作业是周期性的,因此对象不断增加。虽然我检查了beforesave中的唯一性,但有时会出现一些重复的项目,大约10%的对象是重复的。

我一直在尝试删除这些重复项,并希望创建一个可以立即获取所有对象的查询逻辑。查询的最大限制为1000.我提到this question on Parse Help,并尝试将其转换为JavaScript云代码。

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);
});

代码失败,作业状态为“无法连接到Cloud Code ”。我认为它会进入无限循环并在2-3分钟后超时。如果有人可以提供帮助,那就太棒了。

编辑:可以使用Promise帮助吗?


编辑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);
}

现在代码没有进入query_new.find()。函数中的日志消息不会出现,直接显示消息“下面....”。

2 个答案:

答案 0 :(得分:15)

以下代码将查找该类中的所有项目,它不使用skip,因为parse.com有另一个极限限制调用"unable to skip more than 10000 items"。它跳过使用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);
});

答案 1 :(得分:1)

Parse中的所有JS调用都是异步的,因此你的函数会产生无限的线程(即使它是同步的,你的query.skip(skip)也需要进入while循环内部。

尝试将查询移出到自己的函数,该函数在成功时递归调用,直到您已读取所有对象为止。您应该能够调整此答案中的代码,这是针对类似问题的:https://stackoverflow.com/a/17268263/1176247