Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Problemas com Observable

Olá, tenho uma page Home de carros e um provider, que faz a busca no indexedDb pelos carros. Fiz do jeito como foi mostrdao na aula, porém na minha home.ts, o retorno da promise é undefined.

carro-home.ts

import { CarroProvider } from './../../providers/carro/carro';
import { CadastroCarroPage } from './../cadastro-carro/cadastro-carro';
import { Combustivel } from './../../models/Combustivel';
import { Carro } from './../../models/Carro';
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';

@IonicPage()
@Component({
    selector: 'page-carro-home',
    templateUrl: 'carro-home.html',
})
export class CarroHomePage 
{
    public carroList: Carro[] = [];

    constructor(public navCtrl: NavController, public navParams: NavParams, private _carroProvider: CarroProvider) 
    {}

    ionViewDidLoad() 
    {
        this._carroProvider.listAll()
            .subscribe(
                (carros: Carro[]) => 
                {
                    console.log(carros);
                },
                (err) => {
                    console.log('erro');
                    console.log(err);
                }
            );
    }
}

meu provider

import { Carro } from './../../models/Carro';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Storage } from '@ionic/storage';
import { DatePipe } from '@angular/common';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class CarroProvider 
{
    constructor(private _storage: Storage, private _datepipe: DatePipe) {}

    public listAll()
    {
        let carros: Carro[] = [];

        let promise = this._storage.forEach(
            (carro: Carro) => {
                // let currentKey = key.substr(0, 5);

                // if (currentKey == 'carro')
                    carros.push(carro);
            }
        )
        .then(
            () => { carros; }
        );

        return Observable.fromPromise(promise);
    }
}

O console log printa undefined. No meu provider, o array está corretamente populado. Creio que o problema esteja no retorno do provider para a page

3 respostas
solução!

Boa noite, José! Como vai?

No CarroProvider, o correto seria fazer:

public listAll() {
     let carros: Carro[] = [];

     let promise = this._storage.forEach(
          (carro: Carro) => {
               carros.push(carro);
          }
     )
     .then(
          () => carros // repare que aqui não tem mais as chaves.
     );

     return Observable.fromPromise(promise);
}

Vê aí se resolve o seu problema!

Grande abraço e bons estudos!

Era isso mesmo.

Sei que não é o fórum correto, mas qual a diferença entre usar ou não as {}?

O uso das chaves é opcional quando o corpo da arrow function só tem uma única instrução. Se tiver mais de uma instrução o uso é obrigatório.

Quando as chaves são omitidas nos casos possíveis, o Javascript irá avaliar se a function precisa de um retorno ou não. Se precisar o return será adicionado implicitamente, caso não precise não será adicionado.

Ou seja, a solução do seu problema poderia ser omitindo as chaves como vc viu na minha resposta ou então mantendo eles e acrescentando um return antes de carros.

.then(
     () => { return carros; }
);

O fato de vc ter acrescentando a chaves e não ter dado o return fez com que a lista de carros não fosse retornada na conclusão da promise.