前端宝典二十一:前端异步编程规范手写Promise、async、await

本文主要探讨前端异步编程的处理方式、处理场景,并且手写Promise的全家桶,介绍async、await方法使用

一、异步处理方式有:

1. 回调函数

function fetchDate(callback) {
   
    setTimeout(() => {
   
        const date = new Date();
        callback(date);
    }, 1000);   
}
fetchDate((function(date) {
   
    console.log
}));

2. promise

const fetchPromise = (callback) => {
   
    return new Promise((resolve, reject) => {
   
        resolve(callback);
        reject('Error');
    }).then((date) => {
   
        console.log(date);
    }).catch((err) => {
   
        console.log(err);
    })
}

3. async、await

async function name(params) {
   
    try {
   
        const data1 = await fecth('https://jsonplaceholder.typicode.com/posts');
        const data2 = await fecth('https://jsonplaceholder.typicode.com/users');
        const data3 = await fecth('https://jsonplaceholder.typicode.com/comments');
    } catch (error) {
   
        console.log(error);
    }
}

4. 发布订阅模式

这里手写一个EventEmitter使用发布订阅模式实现异步操作:

class EventEmitter {
   
  constructor() {
   
    this.events = {
   };
  }

  on(eventName, callback) {
   
    if (!this.events[eventName]) {
   
      this.events[eventName] = [];
    }
    this.events[eventName].push(callback);
  }

  emit(eventName,...args) {
   
    if (this.events[eventName]) {
   
      this.events[eventName].forEach(callback => callback(...args));
    }
  }

  off(eventName, callback) {
   
    if (this.events[eventName]) {
   
      this.events[eventName] = this.events[eventName].filter(cb => cb!== callback);
    }
  }
}

const eventEmitter = new EventEmitter();

function asyncOperation() {
   
  return new Promise((resolve, reject) => {
   
    setTimeout(() => {
   
      resolve('Async operation completed!');
    }, 2000);
  });
}

async function performAsyncWithPubSub() {
   
  eventEmitter.on('operationCompleted', result => {
   
    console.log(result);
  });

  const result = await asyncOperation();
  eventEmitter.emit('operationCompleted', result);
}

performAsyncWithPubSub();

在这个例子中,我们创建了一个EventEmitter类来实现发布订阅模式。asyncOperation函数模拟一个异步操作,在两秒后返回一个结果。performAsyncWithPubSub函数使用发布订阅模式,在异步操作完成后发布一个事件,然后订阅这个事件的回调函数会被执行并打印出结果。

5. generator函数

6. promise all

const fetchRes = (res) => {
   
    return new Promise((resolve, reject) => {
   
        resolve(res);
    }).then((data) => {
   
        return data
    }).catch((error) => {
   
        console.log(error);
    })
}
const fetchAll = () => {
   
    return Promise.all([fetchRes('res1'), fetchRes('res2')]).then((data) => {
   
        console.log(data);
    }).catch((error) => {
   
        console.log(error);
    }).finally(() => {
   
        console.log('done');
    })    
}

7. 预加载资源

import {
    Image } from 'react-native';

// 预加载图像
Image.prefetch('https://example.com/image.jpg')
 .then(() => console.log('Image preloaded successfully'))
 .catch(error => console.error('Error preloading image:', error));

8. addEvent Listener事件监听

二、异步处理场景

  1. 网络请求
  2. 定时任务
  3. 事件绑定
  4. 大量数据处理web worker
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
</head>

<body>
  <script>
    // 创建 Web Worker
    const worker = new Worker('worker.js');

    // 生成大量数据
    const largeData = Array.from({
      length: 1000000 }, (_,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值