2015-09-07 57 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