@kpoxas

Почему при колбеке теряется переменная из scope?

Имеется парсер html страницы, который заносит данные в DB, c колбеком (ниже). На одной странице имеется несколько опций, которые надо занести в таблицу отдельно. Их перебираю с помощью
$(...).each, затем проверяю существование в таблице ключа product_id-option_id, обновляя или записывая затем новые данные.

...
"callback":function(error,result,$) {
        if (error) {
            logger.error(error);
            return;
        }
        logger.info('(%d/%d) Url %s %d', this.idx, this.total, this.uri, result.statusCode);
        if (result.statusCode!=200) {
            return;
        }
        // $ is a jQuery instance scoped to the server-side DOM of the page
        var product_new = {
            product_id: this.product_id         
        };        
        // options 
        $("#pr .option").each(function(index,a)                   
                  
                product_new.option_id = $(a).data('opt')||0;        
             
                logger.debug('>> pid=%d, opt=%d',product_new.product_id, product_new.option_id);

                Product.find({product_id: product_new.product_id, option_id: product_new.option_id||0}).success(function(product_old){     
                    logger.debug(index);
                    logger.debug('<< pid=%d, opt=%d',product_new.product_id, product_new.option_id);
                });             
            });  
    }


Проблема в том, что методу (объект ORM Sequelizejs) Product.find передается по очереди несколько пар параметров, но в колбеке после поиска их в БД они устанавливаются во всех случаях в последнюю пару:



[Friday, January 31, 2014 11:52:59,379] DEBUG >> pid=76, opt=13
[Friday, January 31, 2014 11:52:59,379] DEBUG >> pid=76, opt=308
[Friday, January 31, 2014 11:52:59,380] DEBUG >> pid=76, opt=310
[Friday, January 31, 2014 11:52:59,380] DEBUG >> pid=76, opt=311
[Friday, January 31, 2014 11:52:59,502] DEBUG 0
[Friday, January 31, 2014 11:52:59,503] DEBUG << pid=76, opt=311
[Friday, January 31, 2014 11:52:59,789] DEBUG 2
[Friday, January 31, 2014 11:52:59,789] DEBUG << pid=76, opt=311
[Friday, January 31, 2014 11:52:59,793] DEBUG 3
[Friday, January 31, 2014 11:52:59,793] DEBUG << pid=76, opt=311
[Friday, January 31, 2014 11:52:59,802] DEBUG 1
[Friday, January 31, 2014 11:52:59,802] DEBUG << pid=76, opt=311



При чем, переменная индекса перебора передается та, которая была при вызове метода Product.find, то есть нормально. Грешил на то что product_new не в скоупе из-за того, что определяется выше перебора опций, но если на каждую опцию product_new копировать локальной переменной, будет тоже самое, но ведь index же нормально передается!
  • Вопрос задан
  • 2664 просмотра
Решения вопроса 2
@gro
Например, просто сделать в начале each()

var product_id = product_new.product_id,
    option_id = product_new.option_id;


и дальше их использовать.
Ответ написан
@kpoxas Автор вопроса
Помогло просто разделить переменные, что касается общих данных - product_new, а на каждую опцию создал option_data_new
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@gro
callback один раз вызван -> есть только один контекст -> product_new определён в нём -> разделяется всеми вложенными функциями

анонимка из each() вызывается для каждого элемента -> каждый раз свой контекст, в котором определён index -> анонимка из success() имеет доступ к тому index, который определён в том же контексте, что и она
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы