回调函数:
当一个函数作为参数传入另一个参数中,并且它不会立即执行,只有当满足一定条件后该函数才可以执行,这种函数就称为回调函数
异步任务:
与之相对应的概念是“同步任务”,同步任务在主线程上排队执行,只有前一个任务执行完毕,才能执行下一个任务。异步任务不进入主线程,而是进入异步队列,前一个任务是否执行完毕不影响下一个任务的执行
setTimeout(function () {console.log('执行了回调函数');
},1000)
console.log('程序结束')
//输出结果是:
//程序结束
//执行了回调函数
这种不阻塞后面任务执行的任务就叫做异步任务
实例1: 打印一句话,语序必须是:”武林要以和为贵,要讲武德,不要窝里斗。”
//回调函数的实现
setTimeout(function () {console.log('武林要以和为贵');setTimeout(function () {console.log('要讲武德');setTimeout(function () {console.log('不要窝里斗');},1000)},2000)
},3000)
回调地狱问题:
Promise对象 是js中的一个原生对象,是一种异步编程的解决方案,可以替换掉传统的回调函数解决方案
ES6中,Promise通过引入一个回调,避免更多的回调,简单说Promise就是一个容器,里面保存着某个未来才会结束的事件 (通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。
//promise对象实现
function fn(str) {//创建promise对象var p=new Promise(function (resolve, reject) {let flag=true;setTimeout(function () {if (flag){resolve(str);//回调成功}else{reject('操作失败');}})})return p;
}
fn('武林要以和为贵').then(d1=>{ //参数d1存放的是promise对象回调成功resolve的信息console.log(d1);return fn('要讲武德');
}).then(d2=>{console.log(d2);return fn('不要窝里斗');
}).then(d3=>{console.log(d3);
}).catch(err=>{console.log(err);
})
Promise有3个状态:
Promise对象状态:
Promise详解:
创建Promise对象:
let promise = new Promise((resolve, reject) => {//执行异步操作代码if (/*成功 */) {resolve(value); //异步操作执行成功后的回调函数}else {reject(error); //异步操作执行失败后的回调函数
});
then():
promise.then((value) => { //成功console.log('成功',value);
},(error) => { //失败('失败',error);
})
catch():
promise.then((value) => {console.log('成功',value);
}).catch((error) => {('失败',error);
})
Promise.all():
var promise1 = solve(70);
var promise2 = 82;
var promise3 = new Promise(function(resolve) {setTimeout(resolve,1000,95); //1秒钟之后执行
});
Promise.all([promise1, promise2, promise3]).then(function(values) {console.log(values);
});// 输出数组: [ 70, 82, 95 ]
Promise.race():
var promise1 = solve(70);
var promise2 = 82;
var promise3 = new Promise(function(resolve) {setTimeout(resolve,1000,95); //1秒钟之后执行
});
Promise.race([promise1, promise2, promise3]).then(function(values) {console.log(values);
});// 输出数组: [ 70]
结论:
Promise虽然跳出了异步嵌套的怪圈,用链式表达更加清晰,但是如果有大量的异步请求的时候,流程复杂的情况下,会发现充满了屏幕的then,而 ES7的 async/await 的出现就是为了解决这种复杂的情况
//async/await的实现
async function test() {let str1=await fn('武林要以和为贵');let str2=await fn('要讲武德');let str3=await fn('不要窝里斗');console.log(str1,str2,str3);
}
异步函数: 是异步编程语法的终极解决方案,它可以让异步代码写成同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了
async 关键字:
await关键字:
Promise和async/await区别:
async/await的特点:
async函数的语法格式:
async function name([param[, param[, ... param]]]) { statements }
function resolveAfter1Seconds() { //将异步过程包装为Promisereturn new Promise(resolve => {setTimeout(() => {resolve('已成功');}, 1000);});
}
async function asyncFunc() { //定义async函数console.log('正在执行async函数');var result = await resolveAfter1Seconds(); // await表达式console.log(result); // 输出'已成功'
}
asyncFunc(); //调用async函数
console.log('async函数代码开始执行');
本文发布于:2024-03-23 14:39:53,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1711176000152522.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |