JavaScript Promise和回调函数
在本文中,我们将介绍Promise、回调函数以及它们之间的区别。
什么是JS中的Promise?
在JavaScript中,使用Promise来管理异步操作。它表示某件事情一定会被做好。Promise用于跟踪异步事件是否已执行,并确定事件发生后会发生什么。
一个Promise有四种状态:
- fulfilled: 与Promise相关的操作成功完成
- rejected: 与Promise相关的操作失败
- pending: Promise仍处于等待状态,尚未完成或拒绝
- settled: Promise已完成或拒绝
语法:
var promise = new Promise(function(resolve, reject){
// do something
});
A promise can be created using Promise constructor.
参数:
- Promise构造函数只接受一个参数,即回调函数(该回调函数也被称为匿名函数)。
- 回调函数接受两个参数,resolve和reject。
- 在回调函数内执行操作,如果一切顺利,则调用resolve。
- 如果所需操作不顺利,则调用reject。
示例 :
Javascript
var promise = new Promise(function(resolve, reject) {
const x = "geeksforgeeks";
const y = "geeksforgeeks"
if(x === y) {
resolve();
} else {
reject();
}
});
promise.
then(function () {
console.log('Success, You are a GEEK');
}).
catch(function () {
console.log('Some error has occurred');
});
输出 :
Success, You are a GEEK
Promise的好处:
- 提高代码可读性
- 更好地处理异步操作
- 在异步逻辑中更好地定义控制流
- 更好的错误处理
什么是JS中的回调函数?
回调函数是一种处理在另一个任务完成后执行某个操作的方法。这里的“某个操作”指的是一个函数的执行。如果我们希望在另一个函数返回后立即运行一个函数,可以使用回调函数。
JavaScript函数是对象类型,因此当调用它们时,它们可以作为参数传递给任何其他函数,就像其他对象(字符串、数组等)一样。
JavaScript代码示例来展示回调函数的工作原理:
Javascript
// The add() function is called with arguments a, b
// and callback, callback will be executed just
// after ending of add() function
function add(a, b , callback){
console.log(`The sum of {a} and{b} is ${a+b}`);
callback();
}
// The disp() function is called just
// after the ending of add() function
function disp(){
console.log('This must be printed after addition');
}
// Calling add() function
add(5,6,disp)
输出 :
The sum of 5 and 6 is 11.
This must be printed after addition
解释 :
这里有两个函数 – add(a, b, callback) 和 disp()。在add()函数中,传入了disp()函数作为第三个参数,同时还有两个数字。
作为结果,add()会被调用,传入1、2以及回调函数disp()。add()会打印这两个数字的相加结果,完成后立即触发回调函数!因此,我们会在额外的输出下方看到disp()里面的内容。
回调函数的好处 :
- 你可以在等待前一个函数调用的结果后再运行另一个函数调用。
- 你可以从子函数中调用父函数,并且还可以传递数据从子函数到父函数。
JavaScript中的Promise与回调函数的比较
比较项 | JavaScript回调函数 | JavaScript Promise |
---|---|---|
语法 | 语法难以理解。 | 语法用户友好,容易阅读,因为有then和catch。 |
错误处理 | 错误处理可能难以管理。 | 使用catch块可以更容易地管理错误处理。 |
回调地狱 | 可能会导致回调地狱。 | 可以解决回调地狱问题。 |