当前位置: 首页 > news >正文

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

1.回调函数

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

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

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

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

  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.getPromiseData().then((data) => {
      console.log(data);
    });

3.Observable(集成在rxjs模块)

import { Observable } from 'rxjs';

 

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

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

 

转载于:https://www.cnblogs.com/wskxy/p/10383841.html

相关文章:

  • maven tomcat jstl 异常
  • maven下载及配置(win7 64位系统)
  • 寒假一:打印沙漏
  • unity depth texture-01
  • LinearEyeDepth和Linear01Depth
  • 打印沙漏
  • SQLAlchemy增删改查 一对多 多对多
  • 体积光,体积雾——链接
  • python 变量搜寻顺序法则LEGB之E注意事项
  • 体积雾
  • Java线程池详解(一)
  • 穷人为什么穷?
  • 【bzoj4567】[Scoi2016]背单词
  • Python基础python是如何进行内存管理的
  • Scriptable Render Pipeline-Custom Pipeline
  • [Vue CLI 3] 配置解析之 css.extract
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【知识碎片】第三方登录弹窗效果
  • JS字符串转数字方法总结
  • Python中eval与exec的使用及区别
  • Selenium实战教程系列(二)---元素定位
  • vue脚手架vue-cli
  • 猴子数据域名防封接口降低小说被封的风险
  • 简单基于spring的redis配置(单机和集群模式)
  • 简单实现一个textarea自适应高度
  • 巧用 TypeScript (一)
  • 少走弯路,给Java 1~5 年程序员的建议
  • 实现简单的正则表达式引擎
  • 数组的操作
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一个完整Java Web项目背后的密码
  • 移动端唤起键盘时取消position:fixed定位
  • ionic入门之数据绑定显示-1
  • ​iOS实时查看App运行日志
  • #每日一题合集#牛客JZ23-JZ33
  • $.ajax()参数及用法
  • $.each()与$(selector).each()
  • (30)数组元素和与数字和的绝对差
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (汇总)os模块以及shutil模块对文件的操作
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • ***监测系统的构建(chkrootkit )
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .Net Remoting常用部署结构
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET委托:一个关于C#的睡前故事
  • /boot 内存空间不够
  • /proc/stat文件详解(翻译)
  • @RequestParam详解
  • @Valid和@NotNull字段校验使用
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序