解析for循环中的云代码查询

时间:2015-05-21 13:49:13

标签: parse-platform cloud-code

我有一个名为friends的表格,其中包含字段 useridfriendid

我想查询数据库以找到用户的朋友。使用以下代码可以正常工作:

Parse.Cloud.define("searchfriend", function(request, response) {
  var query = new Parse.Query("friends");
  query.equalTo("player", request.params.myid);
  query.find({
    success: function(results) {
      var listfreundids = [];
      for (var i = 0; i < results.length; ++i) {
        listfreundids[i] = results[i].get("friend");;
}
      response.success(listfreundids);
    },
    error: function() {
      response.error("error");
    }
  });
});

现在我有问题找到与friendid匹配的用户名,因为我无法在for循环中使用第二个查询来查询用户数据库......

2 个答案:

答案 0 :(得分:1)

使用promises,你可以将它分成几个独立的部分。承诺真的很棒使用,也非常容易创建自己的承诺。

我要做的是将其拆分为查找朋友ID的查询,然后查找找到朋友的查询......

Parse.Cloud.define("searchfriend", function(request, response) {
  getFriendIDs(request.params.myid).then(function(friendIDs) {
    return getFriendUserNames(friendIDs);
  }).then(function(friends) {
    response.success(friends);
  }), function(error) {
    response.error(error);
  });
});

// function to get the IDs of friends
function getFriendIDs(myID) {
  var promise = new Parse.Promise();

  var query = new Parse.Query("friends");
  query.equalTo("player", myID);
  query.find().then(function(friendIDs) {
    promise.resolve(friendIDs);
  }, function(error) {
    promise.reject(error);
  });

  return promise;
}

// function to get the friends from a list of IDs
function getFriendUserNames(friendIDs) {
  var promise = new Parse.Promise();

  var query = new Parse.Query("_User");
  query.containedIn("id", friendIDs);

  query.find().then(function(friends) {
    // here I am just returning the array of friends
    // but you can pull the names out if you want.
    promise.resolve(friends);
  }, function(error) {
    promise.reject(error);
  });

  return promise;
}

您也可以随时使用匹配查询...

// function to get friends
function getFriends(myID) {
  var promise = new Parse.Promise();

  var friendQuery = new Parse.Query("friends");
  friendQuery.equalTo("player", myID);

  var userQuery = new Parse.Query("User");
  userQuery.matchesKeyInQuery("ID", "friendID", friendQuery);

  userQuery.find().then(function(friends) {
    promise.resolve(friends);
  }, function(error) {
    promise.reject(error);
  });

  return promise;
}

这将执行连接查询,首先获取朋友ID,然后使用朋友ID获取用户并返回用户对象。

另外,使用promises。它们更易于使用,可以拆分为单独的工作单元。

当然,我不知道这里的语法是否正确以及正确的名称应该是什么,甚至是对象模型的样子,但希望这可以作为指导。

答案 1 :(得分:0)

您不必查询您找到的每个朋友ID(效率低下)。相反,在获取朋友ID列表后,您可以通过使用query.containedIn约束发送朋友ID列表来查询用户数据库。此策略实际上会减少查询次数。根据检索结果,您可以获取朋友(以前找到的)信息。还有一件事要记住,在执行操作后调用响应成功。希望这有帮助。

问候。