异步调用
异步编程(将来才完成,需要等待结果)
- ajax请求
- 注册事件函数
- 定时器
多次异步掉用的依赖分析
1-多次异步调用的返回结果顺序不确定
const fs=require('fs')
fs.readFile("./data/a.txt",function(err,data){
if(err){
//这里抛出异常情况
1-阻止程序代码的执行
2-把错误信息返回,打印给控制台(throw err= return console.log('读取失败'))
throw err
}
console.log(data)
})
2-异步调用结果存在嵌套关系
$.ajax{
url: "http://127.0.0.0:3000/data";
success: function (data) {
console.log(data)
$.ajax({
utl: "http://127.0.0.0:3000/data1";
success: function (data) {
console.log(data)
$.ajax({
url: "http://127.0.0.0:3000/data2";
success: function (data) {
sonsole.log(data)
}
})
}
})
}
})
这种代码风格就是"回调地狱"
为了解决以上“回调地狱”嵌套,在ES6中新增了一个API----Promise对象
Promise
Promise是异步编程的一种解决方案,从语法上讲,Promise是一个对象,从它可以获取异步操作的信息。
Promise最早出现于jQuery中,后来才被提案到ES6中。
promise是一个构造函数,在promise里面的任务是异步的。
完整的promise的声明:
const p1=new Promise((resolved,reject)=>{})
使用Promise解决了:
- 避免多层异步调用的嵌套问题(回调地狱)
- Promise提供了简洁的API,使得控制异步操作更加容易。
基于Promise处理Ajax请求:
通过.then()方式,触发多个异步任务,从而保证异步任务的执行顺序
封装的ajax异步任务:
function queryData(type=get,url){
return new Promise(function(resolve,reject){
const xhr=new XMLHttpRequest();
xhr.open(type,url);
xhr.send();
xhr.onchange=function(){
if(xhr.readyState!=4)return;
if(xhr.readyState==4 && xhr.readyState==200){
resolve(xhr.responseText)
}else{
reject('服务器错误');
}
}
})
}
promise常用的API(根据上面的promise举例)
p1.then()得到异步任务正确结果
p1.catch()获取异常信息
p1.finally()成功与否都会执行
p1.then(resolved的函数).catch(reject的函数).finally(成功与否都会成功的函数)
async await
async/await简洁:
- async/await是写异步代码的新方式,以前用的方法是回调函数和Promise。
- async/await是基于Promise实现的,它不能用于普通的回调函数。
- async/await和Promise一样,不会阻塞代码。
- async/await使得异步代码看起来像同步代码,这正是它的魅力所在。
async:声明一个异步函数
- 自动将普通函数转换成Promise,返回值也是一个Promise对象。
- 只有async内部的异步任务操作完成,才会继续执行then方法指定的回调函数
- 用await将异步函数变成同步代码
await:暂停异步的功能执行
- await必须搭配async来使用,写在async内部的异步任务前面
- await强制其他代码等待,直到Promise完成并返回结果。
async必须要写在函数前面,该函数会被标记为一个同步的函数