Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在循环中查询以从类中获取所有数据_Javascript_Android_Parse Platform - Fatal编程技术网

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

Javascript 如何在循环中查询以从类中获取所有数据,javascript,android,parse-platform,Javascript,Android,Parse Platform,我有一个类(目前)有1567个对象。它们是我从网站的RSS源解析的文章的URL、标题和发布日期。云作业是周期性的,因此对象不断增加。虽然我在beforesave中检查唯一性,但有时会出现一些重复项,大约10%的对象是重复的 我一直在尝试做一项工作来删除这些重复项,并想做一个查询逻辑,可以一次获得所有对象。查询的最大限制为1000。我引用了,并试图将其转换为JavaScript云代码 Parse.Cloud.job("DeleteDuplicate", function(request, stat

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

我一直在尝试做一项工作来删除这些重复项,并想做一个查询逻辑,可以一次获得所有对象。查询的最大限制为1000。我引用了,并试图将其转换为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);
});
代码失败,作业状态为“无法连接到云代码”。我认为它进入无限循环,并在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”。