Последовательные вызовы console.log приводят к противоречивым результатам.

Хорошо, я совершенно ошеломлен этим. (и я могу упустить что-то очевидное, но...)

У меня есть 2 последовательных вызова console.log. Между ними нет ничего другого

console.log($state);
console.log($state.current);

и вот изображение полученных результатов

Снимок экрана Console.log

Почему 2 производят разные текущие объекты? Как это может произойти?


Контекст:

Эти вызовы выполняются внутри вызова ajax при разрешении зависимостей маршрута. Если вам нужно больше кода или контекста, дайте мне знать.

Подтверждена та же проблема в Chrome и Firefox.

Вызов Ajax и функция-оболочка (без каких-либо изменений)

normaCtrl.publicNorma = ['$http', '$state', '$stateParams', 'baseUrl', function ($http, $state, $stateParams, baseUrl)
{
    var id = $stateParams.id;
    return $http.get(baseUrl + "api/public/norma/" + id).then(
        function (response) {
            console.log($state);
            console.log($state.current);
            console.log($state.current.title);
            return response.data;
        }
    );
}];

Возможные сопутствующие вопросы


person Tivie    schedule 27.02.2014    source источник
comment
Код вашего запроса ajax пожалуйста)   -  person Farkhat Mikhalko    schedule 27.02.2014
comment
Возможно ли несколько запросов ajax? Не могли бы вы показать, где на самом деле установлено $state?   -  person ioseph    schedule 27.02.2014
comment
Могут ли другие объекты влиять на эти переменные?   -  person Farkhat Mikhalko    schedule 27.02.2014
comment
$state устанавливается ui-router, сторонней библиотекой для AngularJs.   -  person Tivie    schedule 27.02.2014
comment
@FUserThrowError да, другие объекты могут влиять на эту переменную. AngularJS делает много вещей под капотом   -  person Tivie    schedule 27.02.2014
comment
@Tivie, вы можете попробовать использовать $watch, чтобы увидеть, как другие объекты влияют на них и как )) И я думаю, что проблема в этом !!   -  person Farkhat Mikhalko    schedule 27.02.2014


Ответы (2)


Ну, вот ответ для тех, кто наткнулся на это.

Краткий ответ

Console.log показывает глубоко изменяемые объекты в последнем состоянии выполнения, а не в состоянии, когда был вызван console.log.

Подробнее

По сути, при работе с изменяемыми глубокими объектами Console.log сохраняет ссылку на указанный объект вместо сохранения клона объекта.

Поскольку между сохранением и визуализацией существует временной разрыв, когда вы нажимаете стрелку для дальнейшего изучения, вы видите на самом деле текущее состояние объекта, а не состояние объекта при вызове console.log.

Один из способов всегда убедиться, что вы используете «моментальный снимок объекта», — это вызвать Json.stringify или использовать console.dir, когда это возможно.

person Tivie    schedule 21.05.2015
comment
Обратите внимание, что console.dir в Chrome может не работать (я помню, что работал, но теперь не работает). Json.stringify Работает. - person Izhaki; 06.01.2017

Странный. Это объект ECMA 5 со странным геттером? Все еще не имеет смысла для простого вызова $state. Я предполагаю, что не просто что-то сломалось с вашим GC...

Вы уверены, что эти звонки регистрируются?

person Andrew Templeton    schedule 27.02.2014
comment
Javascript не является многопоточным. Переменная не может изменять значение между вызовами console.log - person Tivie; 27.02.2014
comment
Ой, не заметил, что это было в той же части обещания... Мне пора спать - person Andrew Templeton; 27.02.2014
comment
Я делаю. Сделал поиск по всему проекту для console.log, это только 3 совпадения - person Tivie; 27.02.2014