код ionic 3 angularfire2 в код ionic 4 angularfire2

у меня есть код с ionic 3 angular 5, работающий, как показано ниже

getUser(uid:string){
    console.log('start of getUser with uid:' + uid)
    return new Promise((resolve, reject) =>
      {
        this.db.object("/users/" + uid).snapshotChanges().map(
          (snapshot) => {return snapshot.payload.val()}
        ).subscribe(
          res => {
            console.log('response:' + res)
            resolve(res)
          },
          err => {
            console.log(err)
            reject(err)
          }
        )
      })
  }

однако с ionic 4 .map больше не работает. как преобразовать этот код?


person Vik    schedule 26.11.2018    source источник


Ответы (1)


Так же, как вы можете увидеть здесь

Начиная с версии 5.5 мы добавили "конвейерные операторы", к которым можно получить доступ в rxjs/operators (обратите внимание на множественное число "операторы"). Предполагается, что это лучший подход для извлечения только тех операторов, которые вам нужны, чем операторы «исправлений», найденные в пакете rxjs-compat.

ПРИМЕЧАНИЕ. Использование rxjs или rxjs/операторов без внесения изменений в процесс сборки может привести к увеличению размера пакетов.

Итак, теперь вы можете использовать map() следующим образом:

// RxJS
import { map } from 'rxjs/operators/map';

// ...

getUser(uid:string){
    console.log('start of getUser with uid:' + uid)
    return new Promise((resolve, reject) => {
        this.db.object("/users/" + uid)
            .snapshotChanges()
            .pipe(
                map((snapshot) => {
                    return snapshot.payload.val();
                })
            )
            .subscribe(
                res => {
                    console.log('response:' + res)
                    resolve(res)
                },
                err => {
                    console.log(err)
                    reject(err)
                }
            )
    })
}

Не связано с самим вопросом, но на всякий случай, если вы хотите, чтобы ваш метод getUser() возвращал обещание, вы также можете использовать операторы RXJS (вместо создания и разрешения обещания), например так:

// RxJS
import { map } from 'rxjs/operators/map';
import { tap } from 'rxjs/operators/tap';   

// ...

public getUser(uid: string): Promise<any> {
    console.log('start of getUser with uid:' + uid)

    return this.db
        .object("/users/" + uid)
        .snapshotChanges()
        .pipe(
            map((snapshot) => {
                return snapshot.payload.val();
            }),
            tap((response) => {
                console.log('response:' + response);
            })
        )
        .toPromise()
}
person sebaferreras    schedule 26.11.2018