gpt4 book ai didi

javascript - 在继续使用 Parse.com 之前,如何将 10,000 个结果推送到数组中

转载 作者:行者123 更新时间:2023-12-03 09:52:14 25 4
gpt4 key购买 nike

我有一个 Parse.com 查询和一个函数,我想从 Parse.com 查询发送数据。我需要对表中的所有结果求和,它返回超过 1,000 个 Parse.com 对象。我确信有很多方法可以解决这个问题,但以下是我针对类似任务所采取的方法:

我通常会在程序中发送前 1,000 个结果,同时循环获取 10,000 个或更多结果。

这次我的问题有所不同,因为我需要立即将所有结果的数组发送到下一个函数,以便可以立即处理它们。我已经寻找了有关如何执行此类操作的信息示例,但我尚未理解我所看到的示例。

几个月中,我浏览了 Stackoverflow、Github、Parse 文档、Parse 论坛以及一般网络,以寻求更好的理解。请不要在没有任何额外见解的情况下发送链接来浪费我们的时间,因为我可能已经阅读过它,但我不理解它或无法按原样应用它。

1) 如果我尝试将查询放入函数中,以便可以递归地收集结果,我将无法弄清楚如何从 parse.com 查询外部返回结果。当我这样做时,我只是将结果传递给第一个函数内调用的另一个函数。为了处理数量大于 1,000 的结果,我将循环遍历将结果递归地传递给函数内调用的函数,直到处理完来自 Parse.com 的所有结果。因为我需要立即对所有内容进行求和(我想?我确信还有其他方法可以做到这一点,这就是我所要求的解决方案)

2)如果我将前一千个结果传递给下一个函数,我不知道如何让事情暂停,以便循环可以完成发送所有函数,以便可以立即处理所有函数。

可能还有其他方法来处理这个问题,但这就是我的想法。

这是我想要完成的事情的一个小示例:

var query = new Parse.Query("Table");
query.find().then(function(results){
//results.length > 1000 and I need to process all of the results in $scope.step
$scope.step = _.filter(results, function(n){
return moment(h.createdAt).isAfter(moment([2015]))})

$scope.step 被调用以在前端 HTML 中显示。我确信有一种聪明的方法可以使用循环或数组或其他方法来处理 promise 或回调来实现这一点。我想我可以重复查询 10 次,每次跳过 1,000 个结果,但这会非常困惑,维护起来也是一场噩梦。

此后,我尝试了以下示例来尝试让某些东西发挥作用。

尝试1:

var array = [];
var agentQueryAll = new Parse.Query(Parse.User);
query.limit(1000)
query.find().then(function (results) {
var increment = 0;
while(results > 1000){
var query1 = new Parse.Query(Parse.User);
query1.limit(1000);
query1.skip(increment*1000);
query1.find().then(function (results) {
array.push(results);
increment++
})}
console.log(array);//this is an array with only the first 1,000 results

尝试2:

var array = [];
var SO = function (increment) {
var agentQueryAll = new Parse.Query(Parse.User);
agentQueryAll.limit(1000);
agentQueryAll.skip(increment*1000);
agentQueryAll.find().then(function (results) {
array.push(results);
if(results.length > 1000){
increment++
SO(increment);
} else {
return array;
}
});
};
SO();

如果我console.log函数内部的数组,那么我可以看到正确的结果累积在我的Javascript控制台的数组中。当我 console.log(SO()) 时,我得到一个包含空数组的数组。如果我 console.log(array) 在函数 SO() 之外,我会得到一个空数组 []。

最佳答案

您可以使用 array.reduce(...) 模式来批量获取结果,而不是递归。

由于没有自然发生的数组可供归约,因此您需要合成一个数组,每批处理一个元素。数组元素可以是您喜欢的任何元素,但将它们设置为批量大小很方便,并将任何余数作为最终元素。数组中的值将是传递给 query.limit()limit

function findInBatches(N, batchSize) {
//First apportion N into an array of limits,
//each of bachSize, and finally any remainder.
var limits = [];
for(var nn = N; nn > 0; nn -= batchSize) {
limits.push(Math.min(nn, batchSize));
}

// Now, the limits array can be reduced to build a promise chain,
// which progressively accumulates results in an array as the query.find() promises settle.
var accumulator = [];
return limits.reduce(function(promise, limit, i) {
var query = new Parse.Query(Parse.User);
query.limit(limit);
query.skip(i * batchSize);
return promise.then(function() {
return query.find().then(function (results) {
if (results && results.length) {
accumulator = accumulator.concat(results);
} else {
return Parse.Promise.error('Premature end of results');
}
});
});
}, Parse.Promise.as()) // Parse.Promise.as() gets the chain started.
.then(function() {
return accumulator;
}, function (e) { // error handler
console.log(e);
if (accumulator.length) {
return accumulator; //return any results fetched before the error occurred.
} else {
return Parse.Promise.error('No results found');//explain what went wrong.
}
});
}

调用如下:

findInBatches(10000, 1000).then(function(results) {
//use `results` here
}, function(e) {
//an error occurred. 'No results found' or something unpredicted
});

关于javascript - 在继续使用 Parse.com 之前,如何将 10,000 个结果推送到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30856549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com