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
相关产品推荐
相关产品推荐

