1

我的 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 不再起作用。我如何转换这段代码?

4

1 回答 1

1

就像你在这里看到的一样

从 5.5 版开始,我们发布了“可管道操作符”,可以在 rxjs/operators 中访问(注意复数的“操作符”)。与 rxjs-compat 包中的“补丁”操作符相比,这些方法可以更好地引入您需要的操作符。

注意:使用 rxjs 或 rxjs/operators 而不更改构建过程可能会导致更大的包。

所以现在你可以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()
}
于 2018-11-26T05:20:01.023 回答