如何使用云代码中的Parse promises在循环中进行查询?

时间:2015-12-11 21:48:47

标签: javascript parse-platform promise cloud-code nested-queries

收到的回复总是一个空数组。 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);
 });

2 个答案:

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