return {}易与解构混淆?React Native异步函数返回对象使用疑问
问题解答:return对象写法误解与async函数使用误区
嘿,我来帮你理清这两个问题哈!
一、关于return { ... }被误认为解构语法的问题
首先得明确:你写的return { id : id, sender : sender, ... }是对象字面量语法,用来创建并返回一个新对象;而解构语法是像const { id, sender } = someObject这样,用来从已有对象中提取属性的,两者完全是不同的语法场景。
不过确实有时候会有人把对象字面量和解构搞混,尤其是在箭头函数里(比如() => { id: id }会被当成函数体而非对象返回),但你这里是普通的async function,写法本身没问题。如果想减少误解,推荐用ES6的对象属性简写语法,把代码改成这样:
readMessage = async function(id) { // ...你的逻辑 return { id, sender, subject, message, attachments, sentDate }; }
这样既简洁,一眼就能看出是返回对象,也不会和解构语法混淆啦。
二、关于async函数readMessage的使用误区
你当前的代码有个关键问题:async函数调用后返回的是Promise对象,而不是直接返回函数内部的结果。看你的代码:
queue = []; for (emptyMessage of emptyMessages) { m = this.readMessage(emptyMessage.sisgradId); // m是Promise,不是最终的message对象 queue.push(m); } for (message of queue) { await message; // 这里只是等待Promise完成,但message本身还是Promise对象 console.log(message.message); // 自然拿不到属性,因为Promise没有message属性 }
正确的写法有两种:
1. 逐个await并接收结果
在循环里把await的结果赋值给变量,再用这个变量访问属性:
queue = []; for (const emptyMessage of emptyMessages) { const m = this.readMessage(emptyMessage.sisgradId); queue.push(m); } for (const messagePromise of queue) { const message = await messagePromise; // 接收Promise resolve后的结果 console.log(message.message); console.log(message.id); // ...其他属性 }
2. 用Promise.all批量处理(更高效)
如果这些异步操作之间没有依赖关系,推荐用Promise.all一次性等待所有Promise完成,这样比逐个await效率更高:
const queue = emptyMessages.map(emptyMessage => this.readMessage(emptyMessage.sisgradId) ); const messages = await Promise.all(queue); // 所有Promise都完成后,得到结果数组 for (const message of messages) { console.log(message.message); console.log(message.id); // ...其他属性 }
这样就能正确拿到readMessage返回的对象属性啦!
内容的提问来源于stack exchange,提问作者user6791424
相关产品推荐
相关产品推荐

