Почему значение не присваивается переменной внутри forEach в Angular?

как я могу вернуть переменную «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 выпускаются с учетом совместимости и обратной совместимости, что облегчает обновление приложений на новые версии.


54
2

Ответы:

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();
 });