2015-01-22 4 views
2

Я пишу код javascript, используя Анализ. У меня есть Пользователь класс и Подписки класс. Информация о подписке всех пользователей хранится на . Подписка класс, так что это как отношение для многих.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 содержит только информацию последнего пользователя repetively. Я считаю, что это связано с тем, что второе обещание запроса (queryForSubscription) .count()) выполняется после завершения внешнего цикла.

Предположим, у меня есть Пользователь 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 и т. Д., Но понятия не имели. Пожалуйста, помогите!

UPDATE

GOTTA ЛЮБОВЬ ТАК !!! СПАСИБО ВАМ КАЖДОГО ОДНОГО ОДНОГО ИЗ ВАШИХ ПУТЕЙ ТАК МНОГО! Ещё один вопрос здесь. На самом деле, я получил еще один класс под названием Favorite, чтобы получить количество избранных пользователей каждого пользователя.

Если число любимых пользователей А является 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}] 

Я не слишком уверен, где я поставил новый запрос для Избранного класс ... Нужен ваш совет снова!

+0

Возможно, вам стоит поставить какой-то код синтаксического анализа в ваш вопрос. Таким образом, люди могут видеть, что у вас есть, и помогать вам в этом. – JayDev

+0

Спасибо, Джей! это был мой первый раз, чтобы задать вопрос о stackoverflow :) Я только что редактировал свой пост! –

+0

В чем проблема? – fxm

ответ

2

Вы можете пойти с @Hacketo's answer.

Другого Hacky способ обойти эту ошибку заключается в использовании .forEach():

}).then(function (objects) { 
    objects.forEach(function(object) { 
     var subscription = Parse.Object.extend('Subscription'); 
     ... 
    }); 
}); 

Новых переменная object будет выделен для каждой итерации цикла, и вы должны избежать «общего var» ошибки.


указывая на ошибку

Один из распространенных яваскрипта ловушках является: область видимости локальной переменной не является его ближайшим блок, это его ближайшая функция.

Следующий фрагмент кода:

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]; 
     ... 

Так object переменной в коде OP является фактически общим для всех созданных queryForSubscription переменных, и когда какой-либо из .then(..) Выполняется обратный вызов (после того, как цикл завершается, как указывает OP правильно) переменная object содержит значение последнего элемента в массиве.

+0

Спасибо LeGEC !! Лучший ответ everrrrr! Я снова обновил свой вопрос. не могли бы вы снова взглянуть на него? –

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) 
    ); 
} 
+0

@LeGEC Я не вижу, где ошибка, и как это может быть что-то решить. * ОП обновил свой код. – Hacketo

+0

моя ошибка, ваше исправление сделало бы работу – LeGEC

Смежные вопросы