下面是一个 Promise 使用示例,通过 Promise 实现异步操作的链式调用:
const getUser = (userId) => {return new Promise((resolve, reject) => {// 模拟异步请求setTimeout(() => {const users = [{ id: 1, name: 'Alice' },{ id: 2, name: 'Bob' },{ id: 3, name: 'Charlie' }]const user = users.find(u => u.id === userId)if (!user) {reject(new Error('User not found'))}resolve(user)}, 1000)})
}const getUserPosts = (user) => {return new Promise((resolve, reject) => {// 模拟异步请求setTimeout(() => {const posts = [{ id: 1, userId: 1, title: 'Post 1' },{ id: 2, userId: 1, title: 'Post 2' },{ id: 3, userId: 2, title: 'Post 3' },{ id: 4, userId: 3, title: 'Post 4' },{ id: 5, userId: 3, title: 'Post 5' }]const userPosts = posts.filter(p => p.userId === user.id)resolve(userPosts)}, 2000)})
}getUser(1).then(user => {console.log('User:', user)return getUserPosts(user)}).then(posts => {console.log('User posts:', posts)}).catch(error => {console.error(error)})
在这个示例中,我们定义了两个异步函数 getUser
和 getUserPosts
,它们都返回一个 Promise 对象,用于模拟异步请求。我们通过 getUser
函数获取一个用户对象,然后通过 getUserPosts
函数获取这个用户的文章列表。在 Promise 的链式调用中,我们使用了 then
方法来处理异步操作的结果,使用 catch
方法来处理异常情况。
需要注意的是,Promise 的链式调用可以实现串行的异步操作,也可以实现并行的异步操作。例如,如果我们有多个异步操作需要同时执行,可以使用 Promise.all
函数把它们包装成一个 Promise 对象,然后通过 then
方法处理它们的结果。例如:
const getUsers = () => {return Promise.all([getUser(1),getUser(2),getUser(3)])
}getUsers().then(users => {console.log('Users:', users)}).catch(error => {console.error(error)})
在这个示例中,我们通过 Promise.all
函数把多个异步操作包装成一个 Promise 对象,当所有操作都完成后,我们通过 then
方法获取它们的结果。