解析云代码升序/限制在承诺的查询中不起作用
Parse cloud code ascending / limit won't work in query in promise
在下面的云代码中,第一个查询工作正常。
在链式查询中,如果包含两行代码:
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);
}) ...
我很惊讶它可以在我们没有排序和限制条件的情况下使用。 (我不明白你是如何将 .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);
});
});
注意我们是如何从承诺到承诺的吗?通过返回我们想要的对象作为下一个的输入。另请注意,只要我们遵循从决议中返回结果的规则,链条可以在末尾有一个拒绝功能,也可以有一个中间拒绝功能。
在下面的云代码中,第一个查询工作正常。
在链式查询中,如果包含两行代码:
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);
}) ...
我很惊讶它可以在我们没有排序和限制条件的情况下使用。 (我不明白你是如何将 .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);
});
});
注意我们是如何从承诺到承诺的吗?通过返回我们想要的对象作为下一个的输入。另请注意,只要我们遵循从决议中返回结果的规则,链条可以在末尾有一个拒绝功能,也可以有一个中间拒绝功能。