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

Node.js中如何等待异步函数完成任务?Promise相关问题求解

问题解决方案

一、调整异步任务执行顺序

原代码中console.log("all done!!")属于同步执行逻辑,会优先于异步的fetchData完成前输出。要让它在fetchData所有任务(包括finally)完成后执行,可通过async/await包裹整个异步流程,确保异步操作全部结束后再执行该日志:

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let data = { pCode: "10001", pName: "orange" };
      resolve(data);
    }, 2000);
  });
}

console.log("program start here");

async function main() {
  try {
    const res = await fetchData();
    console.log(res);
  } catch (err) {
    console.log(err);
  } finally {
    console.log("program ends here");
  }
  // 所有异步任务完成后执行
  console.log("all done!!");
}

main();

执行顺序将符合预期:

program start here
{ pCode: '10001', pName: 'orange' }
program ends here
all done!!

二、获取Promise resolved结果作为对象属性

由于fetchData是异步操作,不可能在同步代码中直接获取其resolved后的结果,所有同步声明对象的方式都会得到处于pending状态的Promise。可行方案如下:

方案1:用async函数创建并获取对象

通过async函数封装对象创建逻辑,使用await等待Promise完成,再获取最终对象:

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let data = { pCode: "10001", pName: "orange" };
      resolve(data);
    }, 2000);
  });
}

async function getResolvedObj() {
  return {
    a: await fetchData()
  };
}

// 方式1:通过then获取最终对象
getResolvedObj().then(obj => console.log(obj));

// 方式2:在async函数中用await获取
async function logObj() {
  const obj = await getResolvedObj();
  console.log(obj);
}
logObj();

方案2:先声明对象,异步完成后赋值

若需提前声明对象,可先初始化属性,待Promise完成后再赋值:

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let data = { pCode: "10001", pName: "orange" };
      resolve(data);
    }, 2000);
  });
}

const obj = { a: null };
fetchData().then(res => {
  obj.a = res;
  console.log(obj); // 此时a为resolved结果
});

内容的提问来源于stack exchange,提问作者Rajiv Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:10:49