当前位置:首页 > JavaScript

js异步实现

2026-02-02 05:05:31JavaScript

异步实现的常见方法

JavaScript 中实现异步操作有多种方式,主要包括回调函数、Promise、async/await 和事件监听等。以下介绍几种常用的异步实现方法。

回调函数

回调函数是 JavaScript 中最基础的异步实现方式,通过将函数作为参数传递给另一个函数,在异步操作完成后执行回调。

function fetchData(callback) {
  setTimeout(() => {
    callback('Data fetched');
  }, 1000);
}

fetchData((data) => {
  console.log(data); // 输出: Data fetched
});

Promise

Promise 是 ES6 引入的异步解决方案,提供了更清晰的链式调用和错误处理机制。

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Data fetched');
    }, 1000);
  });
}

fetchData()
  .then((data) => {
    console.log(data); // 输出: Data fetched
  })
  .catch((error) => {
    console.error(error);
  });

async/await

async/await 是 ES2017 引入的语法糖,基于 Promise,使异步代码的书写更加接近同步代码的风格。

async function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Data fetched');
    }, 1000);
  });
}

async function main() {
  try {
    const data = await fetchData();
    console.log(data); // 输出: Data fetched
  } catch (error) {
    console.error(error);
  }
}

main();

事件监听

通过事件监听机制实现异步操作,常见于 DOM 事件或自定义事件。

const EventEmitter = require('events');
const emitter = new EventEmitter();

emitter.on('dataFetched', (data) => {
  console.log(data); // 输出: Data fetched
});

setTimeout(() => {
  emitter.emit('dataFetched', 'Data fetched');
}, 1000);

异步操作的错误处理

异步操作中错误处理至关重要,不同的异步实现方式有不同的错误处理机制。

Promise 的错误处理

通过 .catch() 方法捕获 Promise 链中的错误。

fetchData()
  .then((data) => {
    console.log(data);
  })
  .catch((error) => {
    console.error('Error:', error);
  });

async/await 的错误处理

使用 try...catch 结构捕获异步函数中的错误。

async function main() {
  try {
    const data = await fetchData();
    console.log(data);
  } catch (error) {
    console.error('Error:', error);
  }
}

并行异步操作

在某些场景下需要并行执行多个异步操作,可以通过 Promise.allPromise.race 实现。

Promise.all

等待所有 Promise 完成,返回结果数组;如果有一个失败,立即抛出错误。

const promise1 = fetchData();
const promise2 = fetchData();

Promise.all([promise1, promise2])
  .then((results) => {
    console.log(results); // 输出: ['Data fetched', 'Data fetched']
  })
  .catch((error) => {
    console.error(error);
  });

Promise.race

返回最先完成的 Promise 结果(无论成功或失败)。

Promise.race([promise1, promise2])
  .then((result) => {
    console.log(result); // 输出最先完成的 Promise 的结果
  })
  .catch((error) => {
    console.error(error);
  });

微任务与宏任务

JavaScript 的事件循环机制中,异步任务分为微任务(Microtask)和宏任务(Macrotask),执行顺序不同。

js异步实现

  • 微任务:包括 Promise.thenprocess.nextTick(Node.js)等,在当前任务结束后立即执行。
  • 宏任务:包括 setTimeoutsetIntervalI/O 操作等,在下一个事件循环中执行。
console.log('Start');

setTimeout(() => {
  console.log('Timeout'); // 宏任务
}, 0);

Promise.resolve().then(() => {
  console.log('Promise'); // 微任务
});

console.log('End');

// 输出顺序:
// Start
// End
// Promise
// Timeout

总结

JavaScript 的异步实现方式多样,从早期的回调函数到现代的 async/await,开发者可以根据需求选择合适的方式。Promise 和 async/await 提供了更清晰的代码结构和错误处理机制,而事件监听适用于特定场景。理解微任务和宏任务的执行顺序有助于更好地控制异步流程。

标签: js
分享给朋友:

相关文章

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…

js实现导航菜单

js实现导航菜单

使用HTML和CSS创建基础结构 导航菜单的基础结构通常由HTML的无序列表(<ul>)和列表项(<li>)组成,每个列表项包含一个链接(<a>)。CSS用于样式化…

js 实现验证码

js 实现验证码

实现验证码的 JavaScript 方法 生成随机验证码 验证码通常由随机字符(数字、字母或混合)组成。以下代码生成一个 6 位随机验证码(数字和字母混合): function generateCa…

js 实现mvc

js 实现mvc

MVC 模式简介 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Con…