this
внутри function
зависит от контекста вызова этой function
.onAuthStateChanged
- вызывается переданная ему функция-обработчик, которой устанавливается какой-то this
(или не устанавливается, и тогда он по умолчанию window
или, в строгом режиме, undefined
). И этот this
точно никак не связан с текущим this
Vue, потому что тот никаким образом не передан при вызове, и, соответственно onAuthStateChanged
о нём ничего не знает.(async function(user) { ... }).bind(this)
чтобы жёстко привязать эту функцию к this
.vm.g = 5;
, т.к. таким образом конкретный this
сохранён в переменную и не меняется в зависимости от контекста вызова.async (user) => { ... }
, её механика работы по сути осуществляет неявный bind
.bind
всех методов к this:onAuthStateChanged(this.onAuthStateChanged)
methods: {
onAuthStateChanged: async function (user) { ... }
}
const RunOutsideAngular = (target: any, memberName: string) => {
const method = target[memberName];
return Object.defineProperty(target, memberName, {
writable: true,
configurable: true,
value(...args: any[]) {
return this.ngZone.runOutsideAngular(method.bind(this, ...args))
}
});
};
const RunOutsideAngularAll = (constructor: Function) => {
const keys = new Set<string>();
let proto = constructor.prototype;
do {
if(proto === Object.prototype) break;
Object.getOwnPropertyNames(proto).forEach(
key => typeof proto[key] === 'function'
&& key !== 'constructor'
&& keys.add(key)
);
} while (
proto = Object.getPrototypeOf(proto)
);
keys.forEach(key => RunOutsideAngular(constructor.prototype, key));
}
class SomeClass {
@RunOutsideAngular
myFunc() {
mycode.....
}
}
// или
@RunOutsideAngularAll
class SomeClass {
myFunc() {
mycode.....
}
}
RunOutsideAngular
- по-хорошему надо типизировать дженериком под ангуляр.RunOutsideAngularAll
- обрабатывает все методы и функции, в т.ч. унаследованные, можно упростить чтоб работал только с методами текущего класса. type
будет строго одно из "direct" | "fanout" | "headers" | "topic"
, а получает просто string
.return (await this.rascal.create(RascalConfig as BrokerConfig))
Но это чревато ошибками в самом конфиге.const RascalConfig: BrokerConfig = { ... }
const RascalConfig = { ... } as const
Array.forEach
- синхронный. Он не будет ждать промисов. Либо используй какие-то либы которые умеют асинхронный each
и всё остальное, либо используй обычный цикл: for (const lId of locationIds) {
const syncResp = await fetch(`https://server/sync-one-c/26/41/${lId}`).then(resp => resp.json())
console.log('lId -> ', lId, 'done', syncResp)
})
{ [ключ - настоящее имя класса]: [значение - минифицированное] }
и отдаёт результат в js. $style.className
на значения из этих модулей. $style[somevar + '__bold']
, гарантировано сломает любую такую штуку.