Ответ 1
Будьте осторожны, доверяя консоли, часто возникает асинхронное поведение, которое может вас отвлечь.
Вы ожидаете, что console.log(x)
будет вести себя следующим образом:
- Вы вызываете
console.log(x)
. -
x
сбрасывается на консоль. - Выполнение продолжается с оператором, сразу после вашего вызова
console.log(x)
.
Но это не то, что происходит, реальность более похожа на это:
- Вы вызываете
console.log(x)
. - Браузер захватывает ссылку на
x
и отправляет вызов "реальный"console.log
для последующего использования. - Различные другие биты JavaScript работают (или нет).
- Позже вызов
console.log
из (2) обойдется, чтобы сбросить текущее состояниеx
в консоль, но этотx
не обязательно будет соответствоватьx
как это было в (2).
В вашем случае вы делаете это:
console.log(this.attributes);
console.log(this.attributes.widgets);
Итак, у вас есть что-то вроде этого в (2):
attributes.widgets
^ ^
| |
console.log -+ |
console.log -----------+
а затем что-то происходит в (3), который эффективно выполняет this.attributes.widgets = [...]
(т.е. изменяет ссылку attributes.widget
), и поэтому, когда (4), у вас есть следующее:
attributes.widgets // the new one from (3)
^
|
console.log -+
console.log -----------> widgets // the original from (1)
В результате вы увидите две разные версии widgets
: новую, которая получила что-то в (3) и оригинал, который пуст.
Когда вы это сделаете:
console.log(_(this.attributes).clone());
console.log(_(this.attributes.widgets).clone());
вы захватываете копии this.attributes
и this.attributes.widgets
, которые привязаны к вызовам console.log
, поэтому (3) не будет мешать вашим ссылкам, и вы увидите разумные результаты в консоли.
Чтобы ответить на этот вопрос:
Показывает, что виджеты не являются пустыми при регистрации
this.attributes
, но при регистрацииthis.attributes.widgets
он отображается как пустой. Кто-нибудь знает, что может вызвать это?
Что касается основной проблемы, у вас, вероятно, есть вызов fetch
где-то, и вы не учитываете его асинхронное поведение. Возможно, решение связано с событием "add"
или "reset"
.