如何让对象属性值为async函数的返回值而非Promise对象
解决async函数返回值作为对象属性的问题
你遇到的核心问题是:async函数调用后返回的永远是Promise对象,哪怕函数内部已经用await处理了异步操作。所以直接把a()赋值给对象属性,得到的自然是未解析的Promise,而不是最终的返回值。
下面给你几种可行的解决方案:
1. 在立即执行的async函数中构建对象
因为await只能在async函数内部使用,所以我们可以用一个立即执行的async函数来等待Promise解析,再构建对象:
const promise1 = new Promise(function(resolve, reject) { resolve('myvalue'); }); const a = async () => { var b = await promise1; return b; }; // 立即执行async函数处理异步逻辑 (async () => { const newobj = { 'a': await a() }; console.log(newobj); // 输出: {a: "myvalue"} })();
2. 处理多个异步属性的情况
如果你需要给对象添加多个异步来源的属性,推荐用Promise.all并行处理,这样比逐个await更高效:
const promise1 = new Promise(resolve => resolve('myvalue')); const promise2 = new Promise(resolve => resolve('anothervalue')); const getValA = async () => await promise1; const getValB = async () => await promise2; (async () => { // 并行等待所有Promise完成 const [valA, valB] = await Promise.all([getValA(), getValB()]); const newobj = { a: valA, b: valB }; console.log(newobj); // 输出: {a: "myvalue", b: "anothervalue"} })();
3. 使用Top-Level Await(ES模块环境)
如果你的代码运行在ES模块中(比如文件后缀是.mjs,或者package.json里设置了"type": "module"),可以直接使用顶层await,不需要包裹立即执行函数:
const promise1 = new Promise(function(resolve, reject) { resolve('myvalue'); }); const a = async () => { var b = await promise1; return b; }; // 直接在顶层使用await const newobj = { 'a': await a() }; console.log(newobj); // 输出: {a: "myvalue"}
需要注意的是:同步代码环境下无法直接获取async函数的最终返回值,因为异步操作是非阻塞的,必须等待Promise状态变为resolved后才能拿到结果,所以await是必不可少的环节。
内容的提问来源于stack exchange,提问作者andryjohns
相关产品推荐
相关产品推荐

