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);
});

Angular7_获取异步方法里面的数据的更多相关文章

  1. js获取异步方法里面的数据

    这里介绍  五种方法(说白了本质 就三种) 1.callback回调函数  function getData(callback){ setTimeout(()=>{ let name = '哈哈 ...

  2. 如何用 ajax 连接mysql数据库,并且获取从中返回的数据。ajax获取从mysql返回的数据。responseXML分别输出不同数据的方法。

    开讲前,先说下网上,大部分的关于这方面的博文或者其他什么的,就我自己的感觉,第一说得不详细,第二语言不能很好的被初学者了解. 我这篇博文的标题之所以用了三句,是为了方便其他人好查找: 这里介绍的方法有 ...

  3. .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】

    1.首先在前台dataGridview属性中增加onRowDataBound属性事件 2.然后在后台Observing_RowDataBound事件中增加代码 protected void Obser ...

  4. django获取指定列的数据

    django获取指定列的数据 model一般都是有多个属性的,但是很多时候我们又只需要查询特定的某一个,这个时候可以用到values和values_list [values()](https://do ...

  5. 传递多个参数并获取Web API的数据

    近段时间学习Web Api觉得非常有意思.默认的路由情况之下,获取数据时,它不必指定Action操作名. 还有另外感想,就是自从学习asp.net MVC之后,加上jQuery,让Insus.NET已 ...

  6. 存储过程获取最后插入到数据表里面的ID

    存储过程获取最后插入到数据表里面的ID SET NOCOUNT on;---不返回影响行数提高性能GOcreate proc [sp_bbs_thread_Insert] @id int output ...

  7. Path形状获取字符串型变量数据

    Path形状获取字符串型变量数据: var path = new Path(); path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 ...

  8. 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析

    使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析 因为我在前台使用了jquery的text()方法,而不是html ...

  9. 动态获取ul,li的数据

    通过一个小例子讲下动态获取li标签的数据,前台页面原有样式: <div class="flone"> <ul class="fltwo"> ...

随机推荐

  1. jdk 环境变量

    1. jdk安装后的目录 2.JAVA_HOME C:\Program Files\Java\jdk1.8.0_172 3.PATH %JAVA_HOME%\bin 4.CLASSPATH .;%JA ...

  2. Java 前后端List传值

    js代码 function click(){ var arrays = new Array(); for (var i = 0; i < arr.length; i++) { arrays.pu ...

  3. [Spark][Streaming]Spark读取网络输入的例子

    Spark读取网络输入的例子: 参考如下的URL进行试验 https://stackoverflow.com/questions/46739081/how-to-get-record-in-strin ...

  4. Airflow Python工作流引擎的重要概念介绍

    Airflow Python工作流引擎的重要概念介绍 - watermelonbig的专栏 - CSDN博客https://blog.csdn.net/watermelonbig/article/de ...

  5. Linux--虚拟环境

    一 . 虚拟环境的安装 如果我们在进行多个django项目的话,只用一个物理环境的话,那么会影响效率,这时候我们局可以应用虚拟环境了 virtualenv #指定清华源下载pip的包 pip3 ins ...

  6. 2019-04-03 搭建Mybatis环境

    1. 配置pom.xml依赖 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybat ...

  7. flask 状态保持session和上下文session的区别

    问题场景: 在falsk项目中导入了两个session:    首先,配置文件config.py文件中 有个 flask_session扩展导入了Session  ( from flask_sessi ...

  8. ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)【奇葩的bug】

    #  Bug描述 今天周末,在家里学点新技术,虽然公司分配的任务没有完成(滑稽滑稽) 我先创建了一个mysql数据库,用root用户创建一个新用户,毕竟项目中使用root是非常危险的,尤其是我这样的实 ...

  9. mpvue——页面跳转

    两个页面 两个页面的跳转,只是单纯的A->B这种跳转. 组件 直接使用小程序的组件,navigator,里面还有一些其他的参数,大家可以自行翻阅官方文档 <navigator url=&q ...

  10. Vue——报错总结

    [Vue warn]: Cannot find element: #app [报错原因] 1. 把对应js放在了head标签里面,页面没有加载完成就进行渲染,导致找不到#app. 2.加了<te ...