被作为实参传入另一个函数,并在该外部函数内部调用,用以来完成某些任务的函数,称为回调函数。
回调是一个函数被作为一个参数传递到另一个函数里,在那个函数执行完后再执行。( 也即:B函数被作为参数传递到A函数里,在A函数执行完后再执行B )
例如:
function greeting(name){
alert("hello"+name);
}
function processUserInput(callback){
var name = prompt('请输入你的姓名');
callback(name);
}
processUserInput(greeting);
以上范例为同步回调,它是立即执行的。
然鹅,需要注意的是,回调函数经常被用于继续执行一个异步完成后的操作,被称为异步回调。
异步callbacks
异步callbacks其实就是函数,只不过是作为参数传递给那些在后台执行的其他的函数,当那些后台运行的代码结束,就调用callback函数,通知你工作已经完成,或者其他有趣的事情发生了。使用callbacks有一点老套,在一些老派但经常使用的API里面,你经常看到这种风格。
举个例子,异步callback就是addEventListener()第二个参数
btn.addEventListener('click',()=>{
alert('you clicked me!');
let pElem = document.createElement('p');
pElem.textContent = 'This is a newly-added paragraph.';
document.body.appendChild(pElem);
});
第一个参数是侦听的事件类型,第二个就是事件发生时调用的回调函数。
当我们把回调函数作为一个参数传递给另一个函数时,仅仅是把回调函数定义作为参数传递过去,回调函数并没有立刻执行,回调函数会在包含它的函数的某个地方异步执行,包含函数负责在合适的时候执行回调函数。
回调函数用途广泛–他们不仅仅可以用来控制函数的执行顺序和函数之间的数据传递,还可以根据环境的不同,将数据传递给不同的函数。
回调地狱
一个接口的参数会需要使用另一个接口获取。比如先请求判断一个custom是否存在,存在的话就请求这个custom的信息。就像请求a的数据了之后再去请求b的数据,请求到b的数据再去请求c 的数据,多个回调函数嵌套的写法叫做回调地狱。不方便看,看代码的时候简直是噩梦。
<script src="jquery.js"></script>
$.ajax({
url:"a.json",
dataType:"json",
success(data){
$.ajax({
url:"b.json",
dataType:"json",
success(data){
$.ajax({
url:"c.json",
dataType:"json",
success(data){
console.log(data)
}
})
}
})
}
})
Promise对象主要把回调函数嵌套的写法变成了链式写法
<script src="jquery.js"></script>
<script>
function fun2(url,data){
return $.ajax({
url,
data,
dataType:"json",
})
}
fun2("a.json").then(res=>{
console.log(res);
//对数据进行操作
return fun2("b.json");
//需要返回一个promise对象,才能调用.then()方法;
}).then(res=>{
console.log(res);
})
</script>