如何在async函数中多次执行Promise?代码执行结果不符预期求助
问题原因分析
你犯的核心错误是把addPost定义成了单个Promise实例,而非返回Promise的函数。
Promise的特性是:一旦被创建,内部的异步逻辑就会立即执行,并且状态(pending/resolved/rejected)一旦改变就固定不变。你的代码里,addPost在diffFunction执行时就已经创建好了,对应的setTimeout已经开始计时,1秒后只会执行一次posts.push操作。
当你写await addPost; await addPost;时,第一次await是等待这个Promise完成(完成后添加了Post3),第二次await面对的是已经处于resolved状态的同一个Promise,不会再触发任何新的异步操作,所以数组里只多了1个元素,加上初始的2个,最终就是3个。
修复方案
把addPost改成一个返回Promise的函数,这样每次调用它都会创建新的Promise实例,触发一次添加逻辑:
const posts = [{ title: 'Post 1' }, { title: 'Post 2' }]; var count = 3; const diffFunction = async () => { // 改成函数,每次调用生成新的Promise const addPost = () => new Promise((resolve, reject) => { setTimeout(() => { posts.push({ title: `Post ${count}` }); count++; resolve(count); }, 1000) }) const deletePost = new Promise((res, rej) => { setTimeout(() => { const deltedPost = posts.pop(); res(deltedPost); }, 2000) }) const showDetails = () => { posts.forEach(element => { console.log(element.title); }); } // 调用函数,每次获取新的Promise await addPost(); await addPost(); showDetails(); } diffFunction();
修改后,两次await addPost()会分别触发两个独立的异步操作:第一次等待1秒添加Post3,第二次再等待1秒添加Post4,最终数组里会有4个元素,showDetails()就能输出预期的结果。
内容的提问来源于stack exchange,提问作者Rishabh Sharma
相关产品推荐
相关产品推荐

