收到的回复总是一个空数组。 for循环中的内部stand_query永远不会被执行。另外我想知道在查询中是否还有一个内部查询,那么我该如何实现呢。 STANDS CLASS STADIUMS CLASS以下代码:
var final_list = [];
query.find().then(function(stadiums){
_.each(stadiums,function(stadium){
var stands_query = new Parse.Query(“Stands");
stands_query.equalTo(“stdId”,stadium.get(“stdId"));
var promise = stands_query.find().then(function(stands){
_.each(stands,function(stand){
var jsonObject = {
“stdId": stand.get(“stdId").id,
}
final_list.push(jsonObject);
});
return null;
},function(error){
return response.error(error);
});
return promise;
});
}).then(function(){
response.success(final_list);
});
答案 0 :(得分:1)
您的第一个.then
并未返回任何内容。我打破你的代码,你可以看到它:
query.find().then(function(stadiums){ //anonymous function 1
_.each(stadiums,function(stadium){ //anonymous function 2
return "foo" //this returns "foo" as a result of anonymous function 2.
});
//Nothing explicitly returned from function 1!
}).then(function(){
response.success(final_list);
});
缺少显式return语句的函数将返回undefined
。然后你的代码执行" response.success"在任何内部承诺解决之前。
您可以做的是创建一系列内部承诺,等待Parse.Promise.when:
query.find().then(function(stadiums){
var promises = [];
_.each(stadiums,function(stadium){
var promise = stands_query.find().then(...)
promises.push(promise);
});
//if returning another promise, the ".then" won't execute until it completes.
return Parse.Promise.when(promises);
}).then(function(){
response.success(final_list);
});
所有这些都说明了,根据数据集的大小,您可能会遇到超时问题。请考虑重写您的查询,以便您使用relational queries查询属于Stands
的{{1}}。
现在您已经使用字段更新了问题,看起来您的行Stadium
有两个错误,并且永远不会返回结果。它应该是stands_query.equalTo(“stdId”,stadium.get(“stdId"));
。
答案 1 :(得分:1)
我们有很多体育场,每个体育场都有很多看台。 Stadium和Stand之间的关系由Stands类中名为“stadiumId”的指针列表示在数据中。
在评论中,功能目标非常简单:JSON阵列。这需要一个查询,根本不需要循环:
function allTheStands() {
var query = new Parse.Query("Stands");
query.include("stadiumId");
return query.find().then(function(stands) {
return JSON.stringify(stands);
});
}
// call it like this:
allTheStands().then(function(jsonStands) {
// jsonStands is all of the stands represented as son
});
修改强>
对同一结果更为迂回的方法是在查询中不包含stadiumId,而是在查询完成后进行提取。
(这只是@adamdport给出的一种特定形式的建议,给出了您的数据的详细信息。如果您认为这有用,您应该相信他的答案。)
// adding underscorejs for handling arrays and other utils
var _ = require('underscore');
function allTheStands() {
var stands;
var query = new Parse.Query("Stands");
return query.find().then(function(result) {
stands = result;
// we're not done yet, because we need to fetch each stand's stadium
var promises = _.map(stands, function(stand) {
return stand.get("stadiumId").fetch().then(function(stadium) {
stand.set("stadiumId", stadium);
});
});
// as adamdport suggests, the crux of the looping answer is to use Promise.when()
return Parse.Promise.when(promises);
}).then(function() {
return JSON.stringify(stands);
});
}