我需要绘制Parse返回的查询结果图。用户将选择日期,然后我创建这两个日期之间的日期数组,然后我传递该数组以解析查询。 我的代码如下:
var from = $( "#from" ).val(); //to get from value from a form
var to = $( "#to" ).val(); //to get to value from a form
var dates = []; //to store all dates
var data = []; // to store all data returned by parse
var currentDate = from;
dates.push(from);
while (currentDate != to) {
var addOne = moment(currentDate, "YYYY-MM-DD").add(1, 'days');
currentDate = moment(addOne).format('YYYY-MM-DD');
dates.push(currentDate);
} // to get all dates present between two dates
//using for loop to get data from parse
for(var j = 0; j < dates.length; j++)
{
var dateStart = moment(dates[j], "YYYY-MM-DD").startOf('day'); //to get start of day
var dateEnd = moment(dates[j], "YYYY-MM-DD").endOf('day'); // to get end of day
var noRequests = Parse.Object.extend("Requests");
var query = new Parse.Query(noRequests);
//then I am using greaterThanOrEqualTo and lessThan to calculate number of request made onn that day
query.greaterThanOrEqualTo('createdAt', dateStart._d);
query.lessThan('createdAt', dateEnd._d);
query.count({
success: function(count) {
data.push(count);
if(data.length == dates.length)
{
//passing both array to function which will draw graph using both arrays
drawGraph(dataArray,dateArray);
}
}
});
}
但由于Parse的异步性质,有时候我没有正确获得结果序列。有什么建议?提前谢谢。
答案 0 :(得分:0)
将请求放在循环中总是一个坏主意。我也感到惊讶的是,考虑到你没有从此回复任何承诺,这一切都有效。您需要使用var _ = require("underscore");
,但这将确保您的承诺以正确的顺序执行。
这也不是启动解析请求的方法。而不是使用
var noRequests = Parse.Object.extend("Requests");
var query = new Parse.Query(noRequests);
您应该使用:
var query = new Parse.Query("Request");
如果您真的想要循环此请求,则需要执行以下操作:
var promises = _.map(dates, function(date){
var dateStart = moment(dates[j], "YYYY-MM-DD").startOf('day'); //to get start of day
var dateEnd = moment(dates[j], "YYYY-MM-DD").endOf('day'); // to get end of day
var query = new Parse.Query("Request");
query.greaterThanOrEqualTo('createdAt', dateStart._d);
query.lessThan('createdAt', dateEnd._d);
return query.count()
.then(function(count){
data.push(count);
}, function (error){
console.error(error);
});
});