javascript - Parse - Javascript 嵌套调用

标签 javascript parse-platform

我正在使用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/

相关文章:

javascript - 单击 anchor 链接返回 NULL 作为偏移量

android - 从 parse.com 检索和使用用户信息

ios - 'PF Object' 没有可见的@interface

ios - 如何限制Parse上查询的结果在 `query.limit`后面

javascript - js 正则表达式 - 允许字母、数字和破折号,但不能单独使用一个破折号或多个破折号

javascript - 使用 Jasmine 进行单元测试时模拟全局对象

android - 从 parseObject 获取文件

android - 在 Android 解析中设置 DeviceToken

javascript - 立即使用 AngularJS 从 Firebase 加载数据

javascript - 多个异步系列导致 Javascript 中的错误行为