JavaScript中怎么处理异步

发布时间:2021-07-01 17:31:13 作者:Leah
来源:亿速云 阅读:141

JavaScript中怎么处理异步,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

一、回调函数

回调是一个函数被作为一个参数传递到另一个函数里,在那个函数执行完后再执行。回调函数是异步编程最基本的方法,其优点是简单、容易理解和部署;缺点是容易产生回调地狱。

ajax('XXX1', () => {   // callback 函数体   ajax('XXX2', () => {     // callback 函数体     ajax('XXX3', () => {       // callback 函数体     })   }) })

这就是所谓的回调地狱,回调地狱带来的负面作用有以下几点:

二、事件监听

这种方式,异步任务的执行不取决于代码的顺序,而取决于某个事件是否发生。

(1) 普通方式

f1.on('done', f2);

上面这行代码的意思是,当f1发生done事件,就执行f2。

(2) onclick方法

element.onclick=function(){    //处理函数 }  element.onclick=handler1; element.onclick=handler2; element.onclick=handler3; // 只有handler3会被添加执行

优点:写法兼容到主流浏览器;

缺点:当同一个element元素绑定多个事件时,只有最后一个事件会被添加

(3) addEvenListener

elment.addEvenListener("click",handler1,false); elment.addEvenListener("click",handler2,false); elment.addEvenListener("click",handler3,false);

该方法的第三个参数是一个布尔值:当为false时表示由里向外,true表示由外向里。

三、发布/订阅模式

我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe  pattern)

首先,f2向信号中心jQuery订阅done信号。

jQuery.subscribe('done', f2);

然后,f1进行如下改写:

function f1() {   setTimeout(function () {     jQuery.publish('done');   }, 1000); }

f1执行完成后,向信号中心jQuery发布done信号,从而引发f2的执行。f2完成执行后,可以取消订阅(unsubscribe)

jQuery.unsubscribe('done', f2);

这种方式的优点:可以通过查看“消息中心”,了解存在多少信号、每个信号有多少订阅者,从而监控程序的运行。

四、promise

以上都是ES6之前的异步处理方式。ES6之后出现了promise。它是异步编程的一种解决方案,比传统的解决方案(回调函数)——更合理和更强大。

Promise 对象有以下两个特点。

1. 基本用法

(1) ES6 规定,Promise 对象是一个构造函数,用来生成 Promise 实例。

const promise = new Promise((resolve, reject) => {   if (/* 异步操作成功 */){     resolve(success)   } else {     reject(error)   } })

Promise接收一个函数作为参数,函数里有resolve和reject两个参数:

(2) Promise 实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。

promise.then((success) => {   // 对应于上面的resolve(success)方法 }, (error) => {   // 对应于上面的reject(error)方法 }   // 还可以写成这样 (推荐使用这种写法) promise.then((success) => {   // 对应于上面的resolve(success)方法 }).catch((error) => {   // 对应于上面的reject(error)方法 })

then(onfulfilled,onrejected)方法中有两个参数,两个参数都是函数:

(3) promise构造函数是同步执行的,then方法是异步执行的

const promise = new Promise((resolve, reject) => {   console.log(1)   resolve()   console.log(2) })  promise.then(() => {   console.log(3) })  console.log(4) // 1  2  4   3

2. Promise.finally()

Promise.finally()用于指定不管 Promise 对象最后状态如何,都会执行的操作。

promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});

3. Promise.all()

Promise.all()用于处理多个异步处理,比如说一个页面上需要等多个 ajax 的数据回来才执行相关逻辑。

const p = Promise.all([p1, p2, p3]);

p的状态由p1、p2、p3决定,分成两种情况。

4. Promse.race()

Promse.race()就是赛跑的意思,Promise.race([p1, p2,  p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

const p = Promise.race([p1, p2, p3])

上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise  实例的返回值,就传递给p的回调函数。

五、async/await

async/await是JavaScript为了解决异步问题而提出的一种解决方案,许多人将其称为异步的终极解决方案。async 函数,就是  Generator 函数的语法糖。

相较于 Generator,Async 函数的改进在于下面四点:

1. 使用规则

(1) 凡是在前面添加了async的函数在执行后都会自动返回一个Promise对象

async function test() {      }  let result = test() console.log(result)  //即便代码里test函数什么都没返回,我们依然打出了Promise对象

(2) await必须在async函数里使用,不能单独使用

function test() {   let result = await Promise.resolve('success')   console.log(result) }  test()   //执行以后会报错

2. await 在等什么

看完上述内容,你们掌握JavaScript中怎么处理异步的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

推荐阅读:
  1. 浅谈如何优雅处理JavaScript异步错误
  2. javascript异步处理与Jquery deferred对象用法总结

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javascrip

上一篇:JavaScript 中Utility函数如何使用

下一篇:JavaScript中怎么将数值转换为Boolean

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》