2015-09-07 54 views
2

在以下云代码中,第一个查询可以正常工作。解析云代码升序/限制在承诺查询中不起作用

在链接查询,如果包括的两行代码:

query.ascending("createdAt");  // NOTE 
query.limit(5);      // NOTE 

这是行不通的!如果你注释掉这两行代码,它的效果很好。可能是什么问题呢?

它抛出没有错误,但根本不执行.each。如果你注释掉了这两行代码,那么.each可以完美地执行所有找到的结果。

Parse.Cloud.define("someFunction", function(request, response) 
{ 
    var query = new Parse.Query("Club"); 
    query.equalTo("objectId", request.params.club); 
    query.first(
    { 
     success: function(object) 
     { 
      return object; 
     }, 
     error: function(error) {...} 

    }).then(function(club) 
    { 
     var query = new Parse.Query("Player"); 
     query.equalTo("club", club); 
     query.include("user"); 
     query.ascending("createdAt");  // NOTE 
     query.limit(2);      // NOTE 
     query.each(function(employee) 
     { 
      var teste = employee.get("email") 
      console.log("teste ... " + teste); 
     }) ... 
+0

相关的另一个问题,任何人在这里谷歌搜索谁看见了下面http://stackoverflow.com/questions/32766623 DANH精湛的答案 – Fattie

回答

1

我很惊讶它适用于我们没有排序和限制资格。 (我没有看到你如何将.then()链接回first()的回调版)。可以清理代码并使之工作 - 我认为 - 通过将自己限制为承诺返回的各种解析方法。

我还推荐将因子分解为每个逻辑块的小的承诺返回函数。与...

// return a promise fulfilled with a Club object whose id is 'clubId' 
function clubWithId(clubId) { 
    var query = new Parse.Query("Club"); 
    return query.get(clubId); // prettier than "objectId" equalTo and first() 
} 

// return a promise fulfilled with up to 'limit' Players belonging to 'club' object 
function playersWithClub(club, limit) { 
    var query = new Parse.Query("Player"); 
    query.equalTo("club", club); 
    query.include("user"); 
    query.ascending("createdAt"); 
    query.limit(limit); 
    return query.find(); 
} 

有了这些整齐,可测试的各个部分,我们可以更自信地构建云功能如下...

// a great toolbox for dealing with collections and other stuff 
var _ = require('underscore'); 

Parse.Cloud.define("someFunction", function(request, response) { 
    var clubId = request.params.club; 
    clubWithId(clubId).then(function(club) { 
     return playersWithClub(club, 2); 
    }).then(function(players) { 
     _.each(players, function(player) { 
      var user = player.get("user"); 
      console.log("username is: " + user.username); 
     }); 
     response.success(players); 
    }, function(error) { 
     response.error(error); 
    }); 
}); 

注意我们是如何从承诺到保证?通过返回我们想要的对象作为输入到下一个。另外请注意,只要我们遵循返回分辨率结果的规则,链条可以在最后有一个拒绝函数,也可以有干涉函数。

+0

壮观的答案,DANH !!!!!!!!!!!!!! – Fattie

+0

你应该帮助这个可怜的padawan也,丹:) http://stackoverflow.com/questions/31952170/really-confused-re-how-to-use-parse-promises-correctly-in-cloud-code?rq= 1 – Fattie

+0

:-)我不得不谷歌“padawan”。看起来OP解决了它,但是在这个问题中有很多空间来改进代码。 – danh