异步?异步是相对于同步而言的。同步是逐行执行代码。异步就是分成多个任务同时执行。举个例子:《西游记》中,五庄寺闹事的场景中,少年骂唐僧师徒是偷水果的秃头贼。他到花园里,把人参果树打倒了,一个果子也没有留下。完成工作后,他打开门锁,带着师徒逃走了。这边的猴子,本体还在被骂和生气,分身却跑去铲果树了。这是一个异步过程。异步是如何实现的?javascript不是单线程的,那么它是如何实现异步的呢?如果你正在加班,外卖到了,你会怎么做?如果你自己拿,你的工作思路就会被打断。像孙悟空这样的分身,那是不现实的。幸运的是,公司里不止一个人。我们可以让其他同事帮我们拿,拿到外卖的时候通知我们,然后我们就可以愉快的用餐了。JS也是如此。虽然是单线程,同一时间只能处理一件事情,但是主线程可以发起一个异步请求,对应的工作线程会收到请求并处理,直到工作线程有结果。浏览器会通知主线程之前的请求已经完成,得到结果,可以执行回调函数对得到的结果进行异步处理。如何编写异步代码?最合乎逻辑的方法是通过Promise对象。作为一个例子,让我们看看它是如何使用的。上个月,我姐夫向我借了一些钱。今天偶然碰到他,问他什么时候可以还钱。他说等我下个月发工资他会还我。我说不行,我下个月要出差。他说:那好,姐夫,你告诉我你打算用这笔钱做什么,我给你做。我虽然表示怀疑,但也只能接受。毕竟自己还有别的事情要做,不可能等着他变财。于是我对他说:好吧。那么下个月,你可以直接把你欠我的钱交给我老婆。姐夫爽快地答应了。用代码表达上面的场景,像这样://Promiseobjectletbrother-in-law'spromise=newPromise((promisedthings)=>{setTimeout(()=>{letsalary=2000;//salarypaidletMoneytoberepaid=salary*0.5;//取出承诺还债的一半(待还的钱);//处理小舅子的委托},30*100);//30天后...});//回调函数functionmyrequest(一笔钱){console.log('put'+一笔钱+'交给老婆');}//然后指定回调函数姐夫的承诺.then(我的要求);//小舅子同意了我的请求//3秒后打印:交给老婆1000什么是async/await?它只是JS的语法糖,让你从回调函数中解脱出来。还是以上面的场景为例,如果我打算用这笔钱去按摩……这种事情绝对不能告诉小舅子,被老婆知道了,她肯定会脱光我还活着然后让小舅子把要还的钱直接打到我的银行卡里,我就等银行通知到账了。既不耽误我的工作,也不用把我的计划告诉姐夫,可以自由安排资金的使用。写成代码,看起来是这样的://Promiseobjectletbrother-in-law'spromise=newPromise((promisedthings)=>{setTimeout(()=>{letsalary=2000;//paidletletpayback=薪水*0.5;//取出承诺还债的一半(要还的钱);//处理小舅子的委托},30*100);//30天后...});//asynchronousfunctionasyncfunctionMyplan(){//使用await委托变成:不用处理直接转账给我让一笔钱=await姐夫的承诺;//等待小舅子转账console.log('取'+一笔钱+'去按摩');};//调用异步函数myplan();//之后打印3秒:按摩1000的两种写法有区别吗?两者都是基于Promise对象,只是一个使用then方法指定回调函数,另一个使用await获取resolve值(实际上是参数本身)。需要注意的是await需要写在异步函数中(想想为什么)。让我们做一个小练习来帮助您理解两者之间的区别。functionget(url,callback){varreq=newXMLHttpRequest();req.open('GET',url,true);req.onload=function(){if(req.readyState==4&&req.status==200){回调(req.response);}}req.send();}varurl='https://miao.baidu.com/';get(url,function(html){varre=newRegExp('<[^<>]+>','g');vartext=html.replace(re,"");console.log(text);});//在miao.baidu.com的页面在控制台执行//打印:HelloWorld请参考上面的代码,用一个Promise对象包装一个get函数。使用该函数访问miao.baidu.com,去除所有HTML标签后打印文本。要求:同时使用then和await方法。
