Javascript 解析云代码升序/限制赢得';我不能在有承诺的情况下工作

Javascript 解析云代码升序/限制赢得';我不能在有承诺的情况下工作,javascript,parse-platform,parse-cloud-code,Javascript,Parse Platform,Parse Cloud Code,在下面的云代码中,第一个查询工作正常 在链式查询中,如果包含两行代码: query.ascending("createdAt"); // NOTE query.limit(5); // NOTE 它不起作用!如果你把这两行代码注释掉,效果会很好。有什么问题吗 它不会抛出错误,但根本不会执行.each。如果您注释掉有问题的两行代码,则对于找到的所有结果 Parse.Cloud.define("someFunction", function(re

在下面的云代码中,第一个查询工作正常

在链式查询中,如果包含两行代码:

query.ascending("createdAt");       // NOTE
query.limit(5);                     // NOTE
它不起作用!如果你把这两行代码注释掉,效果会很好。有什么问题吗

它不会抛出错误,但根本不会执行.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);
        }) ...

我感到惊讶的是,它能在没有排序和限制资格的情况下与我们的合作。(我不明白您是如何将
.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);
    });
});

注意我们如何从一个承诺到另一个承诺?通过将我们想要的对象作为输入返回给下一个。还要注意的是,链的末尾可以有一个拒绝函数,也可以有中间函数,只要我们遵循返回解析结果的规则。

你也应该帮助这个可怜的学徒,丹:):-)我不得不用谷歌搜索“学徒”。看起来OP解决了这个问题,但是在这个问题上还有很大的改进空间。注意你的“response.success”在玩家列表中。事实上,“为什么”是你的回答?事实上,这个响应可能只是(比如)像“没有问题”这样的字符串吗?(事实上,在本例中没有实际使用响应,因为它只是运行例程而已。)Thx a 1000000…我试图使我的函数名与它们返回的值一致。如果这是一个过程(一个主要有副作用而不是产生答案的事情),那么像“doSomething”这样的名字和像“done”这样的回答对我来说是有意义的。如果它是FORTRAN意义上的真函数,它的工作是计算一些东西,那么像“playersInClub”这样的名字和这些播放器的响应就很好了。这里的问题更多的是关于形式而不是函数,所以我使用了你的任意名称“someFunction”,并给出了一个任意的结果。。。如果你不需要任何数据,那么“success”是一个非常好的函数响应