简单说:回调是一个在另一个函数完成执行后所执行的函数——故此得名“回调”。
JavaScript 是一种事件驱动的语言。这意味着,在继续之前, JavaScript 不会等待响应,而是继续执行且同时监听事件。例子:
function first(){
console.log(1);
}
function second(){
console.log(2);
}
first();
second();
//1
//2
如果再first中有计时器呢?
function first(){
// 模拟代码延迟
setTimeout( function(){
console.log(1);
}, 500 );
}
function second(){
console.log(2);
}
first();
second();
//2
//1
//并不是 JavaScript 没有按照我们想要的顺序执行我们的函数,而是在继续执行 second() 之前, JavaScript 没有等待 first() 的响应。
1.你可能常听到人家在谈论回调函数(Callback function),但你真的知道回调函数是什么吗?其实回调函数跟一般的函数没什么不同,差别只在于被调用执行的时机。
2.字面上理解下来就是,回调就是一个函数的调用过程。那么就从理解这个调用过程开始吧。函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。
3.其实中文也很好理解:回调,回调,就是回头调用的意思。函数a的事先干完,回头再调用函数b。
4.为什么需要回调函数:
异步:一般ajax请求都是异步的。请求发出去后,处理器会继续执行下面的代码。如果你想ajax请求完成后,做一些事情,显然,直接在下一行写代码是达不到目的。而作为回调函数传给ajax请求,可以控制请求在哪个阶段去调用回调函数,并且不用担心后面的代码执行到什么地方了。
5.总结回调函数就是异步的函数体执行成功或失败调用的传递进来的函数,调用的函数就是回调,为了不影响代码执行的效率,我们不会等待异步的代码执行,而是直接像下面执行,但是像请求,计时器,事件等操作我们在一些情况下必须拿到对应的数据或者返回值,这个时候就可以在异步函数里传入一个回调函数,也就是在异步操作执行结束之后会调用这个回调函数执行一段代码
? 同步:也许你可以不用回调函数也能做同样的事情。但是,使用回调函数,封装性更好,在结构上看上去更紧凑,还可以传入一些局部变量给回调函数。
回调地狱:
有时候前端为了能够拿到异步的数据,使用了大量的回调函数,来获取将来异步执行成功之后的数据。从一定程度上来说,回调地狱能解决问题,但是有缺点,或者说不优雅,阅读性非常差。而Promise就解决了这个问题。
Promise是异步编程的一种解决方案,简单讲是一个容器其中保存这某个未来才会结束的事件的结果,从语法上说,Promise对象可以获取异步操作的消息,而且Promise提供了统一的API对于各种异步操作都可以用同样的方法进行处理 注:李松峰老师翻译为期约
Promise有三种状态,分别是pending(进行中)、fulfilled(已成功)、rejected(已失败)。只有异步操作的结果可以决定当前是哪一种状态,任何其他操作都无法改变这个操作,Promise(承诺)这个名字也是由此而来,表示其他手段无法改变状态
如果状态发生了改变,就不会再改变而且任何时候都可以得到这个结果,Promise状态的改变只有两种情况一种是变为fulfilled另一种是变为rejected,改变后状态就凝固了不会再有任何改变,会一直保持这个结果,这是就成为resolved(已定形)。而且,如果改变已经发生你也可以对Promise添加回调函数获得结果,这与事件有根本的区别,事件如果不监听(dom.addEventListener),错过之后就无法再得到结果
无法取消Promise
,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise
内部抛出的错误,不会反应到外部。第三,当处于pending
状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
基础语法
Promise立即执行,自身是异步
let promise = new Promise(function(resolve, reject) {
console.log(‘Promise‘);
resolve();
});
promise.then(function() {
console.log(‘resolved.‘);
});
console.log(‘Hi!‘);
// Promise
// Hi!
// resolved
上面代码中,Promise 新建后立即执行,所以首先输出的是Promise。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出。
Promise解决的问题:可以获取异步操作的消息,不再循环嵌套,通过内置的API编程更加优雅,提高了代码的可阅读性和可维护性
原文:https://www.cnblogs.com/Code-Is-Fun/p/14829481.html