handwrite promise
2023-09-09 10:46:54
在开始之前,我们先来回顾一下 JavaScript 中的异步编程。异步编程是指在程序执行过程中,某些操作需要等待其他操作完成,但我们不需要等待这些操作完成就可以继续执行程序。
在 JavaScript 中,异步编程通常使用回调函数来实现。回调函数是当一个异步操作完成时被调用的函数。例如,我们使用 setTimeout() 函数来创建一个延迟 1 秒执行的异步操作,并使用一个回调函数来处理这个操作完成后的结果:
setTimeout(function() {
console.log('Hello, world!');
}, 1000);
这个回调函数会在 1 秒后被调用,并输出 "Hello, world!" 到控制台。
但是,当我们有多个异步操作需要处理时,使用回调函数就会变得很麻烦,因为我们需要嵌套多个回调函数,导致代码变得难以阅读和维护。
为了解决这个问题,JavaScript 引入了 Promise 对象。Promise 对象表示一个异步操作的最终完成或失败的结果。它有三个状态:
- pending: 当一个 Promise 对象被创建时,它处于 pending 状态。
- fulfilled: 当一个 Promise 对象的异步操作成功完成时,它处于 fulfilled 状态。
- rejected: 当一个 Promise 对象的异步操作失败时,它处于 rejected 状态。
我们可以使用 then() 方法来处理 Promise 对象的状态。then() 方法接受两个参数,第一个参数是 fulfilled 状态时的回调函数,第二个参数是 rejected 状态时的回调函数。
例如,我们可以使用 then() 方法来处理 setTimeout() 函数的异步操作:
setTimeout(function() {
console.log('Hello, world!');
}).then(function() {
console.log('Done!');
});
这个 then() 方法会在 1 秒后被调用,并输出 "Hello, world!" 和 "Done!" 到控制台。
如果 setTimeout() 函数的异步操作失败,我们可以使用 catch() 方法来处理这个错误:
setTimeout(function() {
console.log('Hello, world!');
}).then(function() {
console.log('Done!');
}).catch(function(error) {
console.log('Error: ' + error);
});
这个 catch() 方法会在 setTimeout() 函数的异步操作失败时被调用,并输出 "Error: ..." 到控制台。
Promise 对象的另一个重要方法是 resolve() 方法。resolve() 方法可以将一个 Promise 对象从 pending 状态转换为 fulfilled 状态。
例如,我们可以使用 resolve() 方法来创建一个 Promise 对象,并在 1 秒后将这个 Promise 对象从 pending 状态转换为 fulfilled 状态:
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('Hello, world!');
}, 1000);
});
promise.then(function(value) {
console.log(value);
});
这个 promise 对象会在 1 秒后被调用,并输出 "Hello, world!" 到控制台。
Promise 对象的另一个重要方法是 reject() 方法。reject() 方法可以将一个 Promise 对象从 pending 状态转换为 rejected 状态。
例如,我们可以使用 reject() 方法来创建一个 Promise 对象,并在 1 秒后将这个 Promise 对象从 pending 状态转换为 rejected 状态:
var promise = new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error('Something went wrong!'));
}, 1000);
});
promise.catch(function(error) {
console.log(error);
});
这个 promise 对象会在 1 秒后被调用,并输出 "Error: Something went wrong!" 到控制台。
Promise 对象的 constructor() 方法可以创建一个 Promise 对象。constructor() 方法接受一个参数,这个参数是一个函数,这个函数有两个参数,分别是 resolve() 和 reject() 方法。
例如,我们可以使用 constructor() 方法来创建一个 Promise 对象:
var promise = new Promise(function(resolve, reject) {
// do something
if (/* condition */) {
resolve('Hello, world!');
} else {
reject(new Error('Something went wrong!'));
}
});
这个 promise 对象会在条件满足时被调用,并输出 "Hello, world!" 到控制台。如果条件不满足,则会输出 "Error: Something went wrong!" 到控制台。
Promise 对象是一个非常强大的工具,可以帮助我们轻松地处理异步操作。它可以防止回调地狱,使我们的代码更加清晰和易于维护。