如何避免 Node.js 中的回调地狱?
Node.js 中回调地狱就是我们有复杂嵌套回调的情况。在这种情况下,每个回调都采用作为先前回调的结果而获得的参数。这种回调结构导致代码可读性和可维护性较差。
借助承诺,我们可以避免回调地狱。javascript 中的承诺是在 Node.js 中处理异步操作的一种方式,它允许我们像同步函数一样从异步函数中返回值。当我们从异步方法中返回一些东西时,它会返回一个承诺,当将来在异步函数内部的然后()方法或等待的帮助下,这个承诺可以用来消费最终值。下面提到了创建承诺的语法。
const promise = new Promise(function(resolve, reject){
// code logic
});
示例:在下面提到的代码示例中,我们在 setTimeout() 的帮助下模拟了一个异步添加操作。
- 首先,我们创建一个 add()函数,该函数接受三个参数,其中两个参数是我们要添加的数字,第三个参数是回调函数,该函数在 2 秒钟后用 add 操作的结果调用。然后,我们使用嵌套回调来模拟回调地狱,计算前四个自然数相加的结果。
- 之后,我们创建一个返回承诺的 addPromise()函数,这个承诺在调用该函数两秒钟后得到解决。然后我们使用 Then()方法和 async/await 来消费承诺。
java 描述语言
// The callback function for function
// is executed after two seconds with
// the result of addition
const add = function (a, b, callback) {
setTimeout(() => {
callback(a + b);
}, 2000);
};
// Using nested callbacks to calculate
// the sum of first four natural numbers.
add(1, 2, (sum1) => {
add(3, sum1, (sum2) => {
add(4, sum2, (sum3) => {
console.log(`Sum of first 4 natural
numbers using callback is ${sum3}`);
});
});
});
// This function returns a promise
// that will later be consumed to get
// the result of addition
const addPromise = function (a, b) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(a + b);
}, 2000);
});
};
// Consuming promises with the chaining of then()
// method and calculating the result
addPromise(1, 2)
.then((sum1) => {
return addPromise(3, sum1);
})
.then((sum2) => {
return addPromise(4, sum2);
})
.then((sum3) => {
console.log(
`Sum of first 4 natural numbers using
promise and then() is ${sum3}`
);
});
// Calculation the result of addition by
// consuming the promise using async/await
(async () => {
const sum1 = await addPromise(1, 2);
const sum2 = await addPromise(3, sum1);
const sum3 = await addPromise(4, sum2);
console.log(
`Sum of first 4 natural numbers using
promise and async/await is ${sum3}`
);
})();
输出:
版权属于:月萌API www.moonapi.com,转载请注明出处