как я могу вернуть переменную «this.qdDias», присвоив ей значение. Я не знаю, почему, когда я использую подписку, я не могу получить значение в конце метода. В этом "console.info(this.qdDias)" я вижу значение, но оно уменьшается в ответе, переменная снова становится неопределенной.
> obterParametroPrazoMap(nomePrazo: string): number {
> console.info("Parametro vindo: ", nomePrazo)
> this.service.obterParametrosgeraisMap().subscribe((data) => {
> this.listParametrosGerais = data.data;
> this.listParametrosGerais.forEach((x) => (this.listParametrosGerais, x));
> for (var i = 0; i < this.listParametrosGerais.length; i++) {
> console.info("comparado: ", this.listParametrosGerais[i].chavePrimaria.tipoParametro.nomeTipoParametro)
> if (this.listParametrosGerais[i].chavePrimaria.tipoParametro.nomeTipoParametro
> === nomePrazo)
> {
> this.qdDias = this.listParametrosGerais[i].quantidadeDiasPrazo;
> console.info(this.qdDias)
> break
> }
> }
> }
> );
> return this.qdDias;
> }
Как это решить?
🤔 А знаете ли вы, что...
Версии Angular выпускаются с учетом совместимости и обратной совместимости, что облегчает обновление приложений на новые версии.
return this.qdDias
выходит за рамки подписки. Но даже если бы возврат был в subscribe()
, все равно бы не получилось. Вы подписываетесь на наблюдаемую this.service.obterParametrosgeraisMap().subscribe()
, которая по своей природе асинхронна. Но вы пытаетесь рассматривать эту функцию как синхронную.
Является ли this.service.obterParametrosgeraisMap()
наблюдаемой, на которую вы можете подписаться? Тогда должно быть this.service.obterParametrosgeraisMap
.
Что это делает? this.listParametrosGerais.forEach((x) => (this.listParametrosGerais, x));
Зачем использовать var
? Должно быть const
или let
?
Это может несколько сработать, но вы должны решить, хотите ли вы вернуть наблюдаемую, из которой вы берете значение. Или вы конвертируете его и разрешаете обещание сохранить асинхронный шаблон https://stackoverflow.com/a/42185519/15439733 или что-то еще.
function obterParametroPrazoMap(nomePrazo: string): number {
console.info('Parametro vindo: ', nomePrazo);
let map;
this.service.obterParametrosgeraisMap.pipe(take(1)).subscribe(data => map = data);
this.listParametrosGerais = map?.data;
this.listParametrosGerais.forEach((x) => (this.listParametrosGerais, x));
for (var i = 0; i < this.listParametrosGerais.length; i++) {
console.info('comparado: ', this.listParametrosGerais[i].chavePrimaria.tipoParametro.nomeTipoParametro);
if (this.listParametrosGerais[i].chavePrimaria.tipoParametro.nomeTipoParametro === nomePrazo) {
this.qdDias = this.listParametrosGerais[i].quantidadeDiasPrazo;
console.info(this.qdDias);
break;
}
}
return this.qdDias;
}
Я решил это так:
Promise.resolve(2);
Promise.all([
this.service.obterParametrosgeraisMap()
.then((lista: any) => {
this.listParametrosGerais = lista.data;
})
,
this.service.obterParametrosEspecificosMap()
.then((lista: any) => {
this.listParametrosEspecifico = lista.data;
})
]).then(() => {
this.iniciarVariaveisDicionario();
});