Angular Rxjs异步请求和http请求

 

 

一、异步请求

异步请求有三种方式:1. 回调函数获取异步数据  2.Promis获取异步数据  3. Rxjs获取异步数据

1.1 回调函数获取异步数据

通过函数传递,并在回调函数中调用这个函数的方式实现回调,但逻辑结构不够清晰,整个过程无法对他进行额外操作,且容易造成回调地狱。

request.service.ts

// 用callback方式
  getCallbackData(cb) {
    setTimeout(() => {
        var username = "张三";
        cb(username);
    },1000);
  }

外部调用:

// callback获取异步数据
this.request.getCallbackData((data) => {
  console.log("callback = " + data);
});

 

1.2 Promise获取异步数据

通过ES6提供的Promis获取异步数据,可以做阻塞等多种操作。若成功则调用resolve返回,失败调用reject返回

request.service.ts

 // 用Promise处理异步
  getPromisData() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        var username = "李四";
        resolve(username);
      },3000);
    })
  }

外部调用:

// Promise获取异步数据
var promiseData = this.request.getPromisData();
promiseData.then((data) => {
  console.log("promise = " + data);
})

 

1.3 Rxjs获取异步数据

Rxjs用法与Promise类似,但关键词不同。Promise中是用resolve、reject、then关键字, Rxjs是用new Observable、next、subscribe来定义的。同时,Rxjs还提供过滤器和匹配功能,可以过滤和修改返回的数据。

request.service.ts

 getRxjsIntervalNum() {
    let count = 0;
    return new Observable<any>((observable) => {
      setInterval(() => {
        count++;
        observable.next(count);
      },1000)
    })
  }

外部调用:

// Rxjs 使用用具方法对返回的数据进行处理
    // filter: 过滤数据
    // map: 处理数据
    var rxjsData4 = this.request.getRxjsIntervalNum();
    rxjsData4.pipe (
      filter((value) => {
        // 只显示偶数的数据了
        if(value%2==0) {
          return true;
        }
      }),
      map((value) => {
        return value*value;
      })
    )
    .subscribe((data) => {
      console.log("rxjs filter map = " + data);
    })
  }

 

二、两种http请求方式

2.1  使用Angular提供的HttpClientModule模块请求

app.module.ts

// 引入HttpClientModule服务
import { HttpClientModule } from '@angular/common/http'

http.service.ts

// 先引入模块组件
import { HttpClient,HttpHeaders } from '@angular/common/http'

外部使用:

get请求

 getData() {
    let api = 'http://a.itying.com/api/productlist';
    // 已经结合了rxjs
    this.http.get(api).subscribe((response:any) => {
      // 自动将服务器的响应数据转换成对象
      console.log(response);
      this.list = response.result;
    });
  }

post请求

doLogin() {
    // 手动设置请求类型
    const httpOptions = {headers: new HttpHeaders({'Content-Type': 'application/json'})};
    var api = "http://127.0.0.1:3000/dologin";
    var data =  {
      "username" : "张三",
      "age": 20
    }
    this.http.post(api, data, httpOptions).subscribe((response:any) => {
      console.log(response);
    })
  }

 

2.2 使用axios请求

2.1.1 先现在axios

npm install axios --save

2.2.2 使用axios

axiosHttp.service.ts

import { Observable } from 'rxjs';
import { Injectable } from '@angular/core';

import axios from 'axios';

@Injectable({
  providedIn: 'root'
})
export class AxiosHttpService {

  constructor() { }

  axiosGet(api) {
    
    return new Observable((observe) => {
      axios.get(api)
      .then(function (response) {
        console.log(response);
        observe.next(response);
      })
      // 失败
      .catch(function (error) {
        observe.next(error);
      })

    })
   
  }
}

外部使用:

axiosGet(api) {
    
    return new Observable((observe) => {
      axios.get(api)
      .then(function (response) {
        console.log(response);
        observe.next(response);
      })
      // 失败
      .catch(function (error) {
        observe.next(error);
      })

    })
   
  }

 

三、axios结合rxjs,封装出一个异步网络请求服务

四、跨域问题的几种解决方式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值