我正在使用 Parse 编写javascript代码。我有用户类和订阅类。所有用户的订阅信息都存储在订阅类中,因此它就像是一对多的关系。
我想检索用户信息和每个用户的订阅计数并将其存储在对象数组中。
我尝试的内容如下:
var user = Parse.User;
var query = new Parse.Query(user);
query.find().then(function(objects) {
return objects;
}).then(function (objects) {
for(var i = 0; i < objects.length; i++) {
var object = objects[i];
var subscription = Parse.Object.extend('Subscription');
var queryForSubscription = new Parse.Query(subscription);
queryForSubscription.equalTo('subscriptionUser', object);
queryForSubscription.count().then(function(subscriptions) {
var userEmail = object.get('email');
var userDOB = object.get('userDOB');
var userJoinedAt = object.createdAt;
var userGender = object.get('userGender') ? 'Male' : 'Female';
var subscriptionCount = subscriptions;
var sub = [
userEmail,
userDOB,
userGender,
userJoinedAt,
subscriptionCount
];
userArray.push(sub);
});
}
});
但是,userArray仅重复包含最后一个用户的信息。我认为这是因为wihitn第二个查询promise(queryForSubscription).count())在外部for循环结束后运行。
假设我有用户A和用户B.用户A有两个订阅,而用户B没有。 我的期望是这样的:
[{User A's email, User A's dob, User A's Gender, User A's Joined Date, 2},
{User B's email, User B's dob, User B's Gender, User B's Joined Date, 0}]
然而,结果是
[{User A's email, User A's dob, User A's Gender, User A's Joined Date, 2},
{User A's email, User A's dob, User A's Gender, User A's Joined Date, 0}]
我现在卡住了。一直试图使用Promise等但不知道......请帮忙!
更新
GOTTA LOVE SO !!!谢谢你们每一个人都非常喜欢! 还有一个问题。实际上,我还有一个名为收藏的课程来计算每个用户的收藏数量。
如果用户A的收藏夹数量为5和3用户B,预期结果最终将如下所示:
[{User A's email, User A's dob, User A's Gender, User A's Joined Date, 2, 5},
{User B's email, User B's dob, User B's Gender, User B's Joined Date, 0, 3}]
我不太确定在哪里为Favorite类添加新查询...再次需要你的建议!
答案 0 :(得分:2)
执行最后一个函数时,您需要保存object
的值。试试这个:
for(var i = 0; i < objects.length; i++) {
var object = objects[i];
queryForSubscription.count().then(
(function(myObject){
return function(subscriptions) {
var userEmail = myObject.get('email');
...
};
})(object)
);
}
答案 1 :(得分:2)
您可以使用@Hacketo's answer。
解决此错误的另一种愚蠢方法是使用.forEach()
:
}).then(function (objects) {
objects.forEach(function(object) {
var subscription = Parse.Object.extend('Subscription');
...
});
});
将为循环的每次迭代分配一个新的object
变量,您应该转义“共享var
”错误。
指出错误
一个常见的javascript陷阱是:局部变量的范围不是最接近的 bloc ,它是最接近的函数。
以下代码段:
function (objects) {
for(var i = 0; i < objects.length; i++) {
var object = objects[i];
...
实际上相当于:
function (objects) {
var i, object;
for(i = 0; i < objects.length; i++) {
object = objects[i];
...
因此OP代码中的object
变量实际上由所有创建的queryForSubscription
变量共享,并且当执行任何.then(..)
回调时(循环结束后,作为OP正确指出),这个object
变量保存数组中最后一项的值。