当前位置:首页 > 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 事件或自定义事件。

js异步实现

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 结构捕获异步函数中的错误。

js异步实现

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),执行顺序不同。

  • 微任务:包括 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实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…