1. 回调函数
回调函数是指一个作为参数传递给另一个函数的函数,它在传给的函数内部执行,而执行此操作的函数是高阶函数。
回调的作用:
javascript在浏览器中的运行是单线程事件,为了防止阻塞长时间运行的操作,使用回调,比如某些函数需要将请求发送到服务器并等待响应。
回调就是一种方法,帮我们确保某些代码直到另一些代码已经执行完毕后才执行。
function dowork(subject, callback){
alert(subject);
callback();
}
function Finished(){
alert('Finished');
}
dowork('math',Finished);
当多个异步函数一个接一个嵌套执行时,会产生回调地狱。避免回调地狱:promise,async-await。
2. Promise
promise主要解决两个问题:
- 回调地狱,代码难以维护
- 支持多个并发请求,解决异步问题
es6 用法
promise是一个构造函数,接受一个函数作为参数,这个函数需要传入两个参数:
- resolve:异步操作执行成功的回调函数
- reject:异步操作执行失败的回调函数
let p = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(() => {
console.log('完成');
resolve('成功');
}, 2000);
})
then
then方法接受两个参数,第一个是resolve的回调,第二个是reject的回调,可以分别拿到他们传过来的数据。
let p = new Promise((resolve, reject) => {
//做一些异步操作
setTimeout(function(){
var num = Math.ceil(Math.random()*10); //生成1-10的随机数
if(num<=5){
resolve(num);
}
else{
reject('数字太大了');
}
}, 2000);
});
p.then((data) => {
console.log('resolved',data);
},(err) => {
console.log('rejected',err);
}
);
catch
用来指定reject的回调,效果和then的第二个参数一样,并且如果执行resolve的回调抛出异常,不会报错卡死,而是进入到catch方法中。
p.then((data) => {
console.log('resolved',data);
}).catch((err) => {
console.log('rejected',err);
});
all
接受一个数组参数,并行执行异步操作,在所有异步操作执行完成后才执行回调。
let Promise1 = new Promise(function(resolve, reject){})
let Promise2 = new Promise(function(resolve, reject){})
let Promise3 = new Promise(function(resolve, reject){})
let p = Promise.all([Promise1, Promise2, Promise3])
p.then(funciton(){
// 三个都成功执行
}, function(){
// 只要有一个失败
})
race
接受两个函数,哪个最先执行完毕,就以哪个为准执行回调
Promise.race([requestImg(), timeout()])
.then((data) =>{
console.log(data);
}).catch((err) => {
console.log(err);
});