You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 04:21:23