我正在使用Parse编写JavaScript代码。我有 User 类和 Subscription 类。所有用户的订阅信息都存储在 Subscription 类中,因此它就像一对多的关系。
我想检索用户信息和每个用户的订阅计数并将其存储在对象数组中。
我尝试过的方法如下:
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 只重复包含最后一个用户的信息。我认为这是因为第二个查询 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 等,但不知道..请帮忙!
更新
太喜欢了!!!非常感谢你们每一个人! 这里还有一个问题。实际上,我还有一个名为 Favourite 的类来计算每个用户的收藏夹数量。
如果用户A最喜欢的数量是5个,用户B最喜欢的数量是3个,那么最终的预期结果将是这样的:
[{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}]
我不太确定在哪里对最喜欢的类(class)添加了新查询...再次需要您的建议!
最佳答案
您可以选择@Hacketo's answer .
解决此错误的另一种方法是使用 .forEach()
:
}).then(function (objects) {
objects.forEach(function(object) {
var subscription = Parse.Object.extend('Subscription');
...
});
});
将为循环的每次迭代分配一个新的object
变量,您应该避免“共享var
”错误。
指出错误
常见的 JavaScript 陷阱之一是:局部变量的作用域不是其最近的 block ,而是其函数。
以下代码片段:
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
变量保存数组中最后一项的值。
关于javascript - Parse - Javascript 嵌套调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28082786/