异步操作与编程

75 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

JavaScript两种异步方式(单线程编程语言):

- 传统回调函数 (Callback Function) 例如 setTimeOut ,让一个函数在指定的时间后执行。

  • 回调函数缺点:

    函数回调地狱: 一个函数执行完在执行内部另外一个,一层一层嵌套,

    - 单线程优点: 由于所有操作运行在一个线程中,无需考虑线程同步和资源竞争的开销,避免了线程之间的频繁切换和竞争问题,降低了线程自身的开销

Promise

  • Promise (承诺) : 寓意这个去这个请求会在未来某一个时刻返回
  • 解决了回调地狱的问题
  • 例如:AJAX:Promise 发起一个请求来获取服务器的数据,可以用它动态更新页面的内容
  • fetch 向服务器请求,返回Promise对象, 渲染前端,如果可以使用then 进行接受 返回的结果

Promise优点:

我们可以用链式结构将多个异步操作串联起来如下

可以不断追加类似java8 stream,这样的链式调用避免了层层嵌套,可读性会提升很多。一个人东西的出现一定是解决某类问题

catch: 用来捕获错误,任意一个阶段发生错误,catch 将会被触发,而之后的 then() 将不会执行,

如果这样请求过程中某个戒断遇到错误,我们会触发catch,then将不会执行 ,类似 java 语法

**finally:**在 promise 链结束之后调用,无论失败与否,我们可以在这里做一些清理工作

我们在请求过程中 如果有一段 必须要执行的代码可以放在 finally 中 ,学过java异常就是一样的道理

一般我们用来释放资源, 关闭声明请求,清理工作

新标准ECMA17 的 async/ await

一句话概括:

基于 promise 之上的语法糖,让异步操作变简单的。使用关键字将函数包装成异步函数,异步函数就是返回值为 promise 对象的函数。

这两关键字基本同根同生, 被 async 修饰的 funcation 接受 请求必须用 await

多个Promise 使用时会打破并行,

第一个执行完才执行第二个,高效做法:

Promise.all内可以传递多个promise对象

然后再使用await ,效率会提升一倍

如果想使用 循环中的 所有操作都并发执行可以使用 for await

不能在全局和 普通函数 中使用 await关键字,只能被应用异步,所以想要使用 await 就必须 用 async修饰函数

所以说就跟你对象一样 ,必须相互配合才能完成一些事情