1.回调函数

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

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

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

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

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

  调用

this.getAsyncName((data) => {
console.log(data);
}); 成功输出:async_张三

2.Promise处理异步

  getPromiseData() {
return new Promise((success, error) => {
setTimeout(() => {
success('promise_张三');
}, );
});
} ps:error为失败回调函数,可以不写

  调用

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

3.Observable(集成在rxjs模块)

import { Observable } from 'rxjs';
  getObservableData() {
return new Observable((obserber) => {
setTimeout(() => {
obserber.next('rxjs_张三');
}, );
});
} ps:失败回调为obserber.error('失败');

  调用

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

  可见Promise和Observable非常相似

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

  a.取消订阅

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

  由于getObservableData方法是一秒后执行的,程序获得返回值之前执行了取消订阅,所以这里将不打印出结果

  b.循环监听

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

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

  调用

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

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

  

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

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

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

  调用

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

  好,这很容易,前面也提到过了,但是现在我们不改变原本的函数,但是只要打印偶数呢(对值进行筛选)

import { filter } from 'rxjs/operators';

  修改函数如下:

    this.getObservable_Num_Data()
.pipe(
filter((value: number) => {
if (value % === ) {
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 % === ) {
return true;
}
}),
map((value: number) => {
return value * value;
}),
map((value: number) => {
return value * ;
})
)
.subscribe((data) => {
console.log(data);
});

最新文章

  1. Highcharts配置
  2. C++之路进阶codevs1269(匈牙利游戏)
  3. POJ1236 network of schools
  4. jsp:中文乱码解决
  5. 第十五章:Android 调用WebService(.net平台)
  6. .Net开源项目之开源论坛
  7. 用PYTHON + PYWIN32 + WMI获取WINDOWS系统基本信息
  8. Apache下载、安装及配置(Windows版)
  9. django中admin
  10. vue 起步
  11. Pollard Rho大质数分解学习笔记
  12. Github好桑心,慢慢来吧,等待中
  13. PHP做Web开发的MVC框架(Smarty使用说明 )
  14. eclipse cdt运行c程序报错“launch failed,binary not found”
  15. MS sql 无法进行事务日志备份
  16. html 里面的 role 属性是什么意义和用途
  17. 解决clion2016.3不能支持搜狗输入法的问题
  18. 在Centos7下安装与部署.net core
  19. QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写
  20. 【8.28校内测试】【区间DP】

热门文章

  1. ElasticSearch(七):Java操作elasticsearch基于smartcn中文分词查询
  2. 前端学习-基础部分-css(二)
  3. Oracle 查询重复索引列
  4. 函数rand,randn,randi
  5. 编写python程序和运行.py文件的方法步骤
  6. ES6类封装判断用户上下左右滑动事件!
  7. 关于JAVA中string直接初始化赋值和new的区别,是否可以联系到int[]的情况
  8. winform,同个程序只允许启动一次
  9. Laravel 框架结构 以及目录文件解读(学习笔记)
  10. java学习之—实现一个简单的ArrayList