Please enable Javascript to view the contents

【JS异步入门】异步方式与场景

 ·  ☕ 2 分钟

JavaScript 可以通过以下几种方式实现异步:

回调函数:将回调函数作为异步函数的参数,在异步操作完成后调用回调函数。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function fetchData(callback) {
  // 异步操作
  setTimeout(function() {
    const data = { name: 'Alice', age: 20 }
    callback(data)
  }, 1000)
}

fetchData(function(data) {
  console.log(data) // { name: 'Alice', age: 20 }
})
Promise使用 Promise 对象可以更方便地实现异步操作可以通过 then() 方法链式调用处理异步操作的结果例如
function fetchData() {
  return new Promise(function(resolve, reject){
    // 异步操作
    setTimeout(function() {
      const data = { name: 'Alice', age: 20 }
      resolve(data)
    }, 1000)
  })
}

fetchData().then(function(data) {
  console.log(data) // { name: 'Alice', age: 20 }
})
async/awaitasync/await 是在 Promise 基础上进行的封装使用起来更加方便代码更加易读易写例如
async function fetchData() {
  // 异步操作
  await new Promise(resolve => setTimeout(resolve, 1000))
  const data = { name: 'Alice', age: 20 }
  return data
}

fetchData().then(function(data) {
  console.log(data) // { name: 'Alice', age: 20 }
})

JavaScript 中的异步场景很多,常见的包括:

网络请求:使用 XMLHttpRequest 或者 fetch 发送请求时,需要等待服务器响应,此时 JavaScript 代码会被阻塞,因此需要使用异步方式,以便在请求返回时能够继续执行代码。

定时器:使用 setTimeout 或者 setInterval 创建定时器时,需要等待指定的时间后才能执行下一步操作,因此同样需要使用异步方式。

事件监听:当页面上某个元素发生特定的事件时(如点击、滚动、拖拽等),需要执行相应的代码,此时也需要使用异步方式。

Promise 和 async/await:使用 Promise 和 async/await 进行异步操作是非常常见的场景,例如在处理文件上传、数据查询等方面。

异步会引发什么样的困难?

异步编程在一定程度上可以提高代码的效率和响应速度,但同时也会引发以下困难:

困难的调试:异步代码在同步代码之后执行,因此出现错误时难以定位、调试。

回调地狱:在一些复杂场景下,多次使用回调函数会造成代码的嵌套过深,这种情况被称为回调地狱,不仅降低了代码的可读性,也增加了代码维护的难度。

容易出错:异步代码多次执行,极易出现因执行顺序不当或调用次数不当而导致的问题,需要遵循严格的代码执行顺序和调用次数。

跨域安全问题:异步请求数据时可能引起跨域安全问题,需要在服务器端进行配置或使用 JSONP 等跨域请求方式。

多线程并发:JavaScript 是单线程语言,当异步同时执行时,需要处理多个线程之间的并发问题,需要特别谨慎处理以避免出现问题。

因此,在使用异步编程时,需要特别注意以上问题,保证代码的可靠性和可维护性。

微任务、宏任务与Event-Loop - 掘金

分享

码中人
作者
码中人
Web Developer