解析 - Javascript嵌套调用

时间:2015-01-22 06:47:49

标签: javascript parse-platform

我正在使用 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类添加新查询...再次需要你的建议!

2 个答案:

答案 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变量保存数组中最后一项的值。