Angular7_获取异步方法里面的数据

1.回调函数promise

  getName() {
    return '张三';
  }
  getAsyncName() {
    setTimeout(() => {
      return 'async_张三';
    }, 1000);
  }

  这是咱们定义好的两个函数,当调用这两个函数的时候,由于setTimeout是异步的,因此并不能正常返回值,补全返回类型可使咱们更加直观的看出效果。异步

  getName(): string 
  getAsyncName(): void 
  console.log(this.getName());   //输出:张三
  console.log(this.getAsyncName());   //输出:undefined

  这时候,要获取返回值,就须要使用回调函数,将getAsyncName()修改为async

  getAsyncName(back) {
    setTimeout(() => {
      back('async_张三');
    }, 1000);
  }

  调用函数

this.getAsyncName((data) => {
      console.log(data);
    });

成功输出:
async_张三
 

 2.Promise处理异步工具

  getPromiseData() {
    return new Promise((success, error) => {
      setTimeout(() => {
        success('promise_张三');
      }, 1000);
    });
  }

ps:error为失败回调函数,能够不写

  调用this

    this.getPromiseData().then((data) => {
      console.log(data);
    });

3.Observable(集成在rxjs模块)spa

import { Observable } from 'rxjs';

 

  getObservableData() {
    return new Observable((obserber) => {
      setTimeout(() => {
        obserber.next('rxjs_张三');
      }, 1000);
    });
  }

ps:失败回调为
obserber.error('失败');
 

  调用code

    this.getObservableData().subscribe((data) => {
      console.log(data);
    });

  可见Promise和Observable很是类似blog

  (Observable强大一点,能够取消订阅、循环监听、提供多种工具函数)rxjs

  a.取消订阅

    const d = this.getObservableData().subscribe((data) => {
      console.log(data);
    });
    d.unsubscribe(); // 取消订阅

  因为getObservableData方法是一秒后执行的,程序得到返回值以前执行了取消订阅,因此这里将不打印出结果

  b.循环监听

  先写一个异步循环函数,每隔一秒返回一个值

  getObservable_Interval_Data() {
    let i = 1;
    return new Observable((obserber) => {
      setInterval(() => {
        i++;
        obserber.next('rxjs_张三_Interval_' + i);
      }, 1000);
    });
  }

  调用

    this.getObservable_Interval_Data().subscribe((data) => {
      console.log(data);
    });

  结果:每隔一秒打印一个值

  

   c.工具函数(pip管道,filter过滤器,map操做)

  咱们先写一个方法,从1开始递增打印

  getObservable_Num_Data() {
    let i = 0;
    return new Observable((obserber) => {
      setInterval(() => {
        i++;
        obserber.next(i);
      }, 1000);
    });
  }

  调用

    this.getObservable_Num_Data().subscribe((data) => {
      console.log(data);
    });

  好,这很容易,前面也提到过了,可是如今咱们不改变本来的函数,可是只要打印偶数呢(对值进行筛选)

import { filter } from 'rxjs/operators';

  修改函数以下:

    this.getObservable_Num_Data()
      .pipe(
        filter((value: number) => {
          if (value % 2 === 0) {
            return true;
          }
        })
      )
      .subscribe((data) => {
        console.log(data);
      });

  如今咱们要打印值的二次幂呢(对值进行操做)

import { map } from 'rxjs/operators';

  修改函数以下:

    this.getObservable_Num_Data()
      .pipe(
        map((value: number) => {
          return value * value;
        })
      )
      .subscribe((data) => {
        console.log(data);
      });

  还有,就是补充一点,pipe管道能够对值进行屡次操做,用逗号隔开,执行顺序从上到下

  如:

    this.getObservable_Num_Data()
      .pipe(
        filter((value: number) => {
          if (value % 2 === 0) {
            return true;
          }
        }),
        map((value: number) => {
          return value * value;
        }),
        map((value: number) => {
          return value * 2;
        })
      )
      .subscribe((data) => {
        console.log(data);
      });
相关文章
相关标签/搜索