Тема: Незрозуміла поведінка коду

Добрий вечір. Маю код

Прихований текст

точніше, він мене

               for(var i = 0; i<allUsers.length; i++)
                        {
                            var queryCount = new Parse.Query(Parse.User);
                            queryCount
                            .greaterThanOrEqualTo(allUsers[i]["score"])
                            .notEqualTo("username",allUsers[i]["username"]);
                            
                            queryCount.count({
                                success: function(count) {
                                    if(allUsers[i]!==undefined){
                                        allUsers[i]["rank"]=count;
                                        allUsers.save();
                                    }
                                                                        
                                    if(i==allUsers.length-1)
                                    {
                                        response.success(allUsers);
                                    }
                                },
                                error: function(error){
                                    response.error(error);
                                }
                            });
                        }

Перед цим циклом я перевіряв довжину масива allUsers, і вона була вірною, в моєму випадку вона дорівнювала п'яти. Але середовище, в котрому виконується скрипт, матюкається на те, що response.success() або response.error() не було викликано.
Я думав, що проблема в асинхронності, тобто на момент першого виконання  if(i==allUsers.length-1) наш цикл вже дійшов до кінця, але навіть в цьому випадку if має виконатись.
Які у вас думки? Чому response.success() може не виконуватись?

2

Re: Незрозуміла поведінка коду

Для початку було б непогано, якби ви фреймворк назвали.

3

Re: Незрозуміла поведінка коду

koala написав:

Для початку було б непогано, якби ви фреймворк назвали.

Parse

4 Востаннє редагувалося koala (10.09.2015 10:59:34)

Re: Незрозуміла поведінка коду

Так, проблема в тому, що на момент виклику success цикл вже закінчився і значення i == allUsers.length.
Задавайте дві різні функції:

Прихований текст
queryCount.count({
  success: (i<allUsers.length-1) ?
    function(count) {
      if(allUsers[i]!==undefined){
        allUsers[i]["rank"]=count;
        allUsers.save();
      }
    } : function(count) {
      if(allUsers[i]!==undefined){
        allUsers[i]["rank"]=count;
        allUsers.save();
      }
      response.success(allUsers);
    }
  },
  error: function(error){
    response.error(error);
  }
});

Або додайте психоделії  %) (для JavaScript це нормально)

Прихований текст
queryCount.count({
  success:(function(current) {
    return function(count) {
      if(allUsers[current]!==undefined){
        allUsers[current]["rank"]=count;
        allUsers.save();
      }
      if(current==allUsers.length-1) {
        response.success(allUsers);
      }
    };
  })(i),
  error: function(error){
    response.error(error);
  }
});
Подякували: Павло Зібров, 221VOLT2

5

Re: Незрозуміла поведінка коду

koala написав:

Так, проблема в тому, що на момент виклику success цикл вже закінчився і значення i == allUsers.length.
Задавайте дві різні функції:

Прихований текст
queryCount.count({
  success: (i<allUsers.length-1) ?
    function(count) {
      if(allUsers[i]!==undefined){
        allUsers[i]["rank"]=count;
        allUsers.save();
      }
    } : function(count) {
      if(allUsers[i]!==undefined){
        allUsers[i]["rank"]=count;
        allUsers.save();
      }
      response.success(allUsers);
    }
  },
  error: function(error){
    response.error(error);
  }
});

Або додайте психоделії  %) (для JavaScript це нормально)

Прихований текст
queryCount.count({
  success:(function(current) {
    return function(count) {
      if(allUsers[current]!==undefined){
        allUsers[current]["rank"]=count;
        allUsers.save();
      }
      if(current==allUsers.length-1) {
        response.success(allUsers);
      }
    };
  })(i),
  error: function(error){
    response.error(error);
  }
});

а чо i==allUsers.length, якщо там умова i<allUsers.length?

6

Re: Незрозуміла поведінка коду

Павло Зібров написав:

а чо i==allUsers.length, якщо там умова i<allUsers.length?

Бо це - умова циклу. Коли вона не виконується (а саме, коли i==allUsers.length), цикл закінчується.

Подякували: Павло Зібров1

7

Re: Незрозуміла поведінка коду

koala написав:
Павло Зібров написав:

а чо i==allUsers.length, якщо там умова i<allUsers.length?

Бо це - умова циклу. Коли вона не виконується (а саме, коли i==allUsers.length), цикл закінчується.

а, точно