我有一个函数,该函数返回一个包含数组的值,并且在数组内部是一个对象 data 我想访问其值。
现在,我在做什么
let budgets = await this.getReferenced(wipDocStore, facebookAdData, 'budget')
budgets = budgets[0].data
但是,我不确定这是否是一种巧妙的方法,或者人们通常会做什么。
对JavaScript来说是新手,我认为类似这样的代码
let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data
但不是(为什么?)。我可以做的另一件事是直接在getReference
函数中返回相关数据,但是由于该函数是可重用的,因此我并不总是希望数据位于数组的第0位。
总的来说,有经验的程序员也会把上面的代码分为两部分
let budgets = await this.getReference(DocStore, AdData, 'budget')
budgets = budgets[0].data
如果他们不能更改this.getReference
功能?还有,为什么这不起作用?
let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data
答案 0 :(得分:3)
忘记您想学习的“绝妙技巧”的内容。
请牢记以下几点:
const reference = await this.getReference(DocStore, AdData, 'budget')
const budgets = reference[0].data
这没有歧义,它清楚地一步一步传达了正在做的事情。您await
引用,然后从引用数组中的第一个条目获取数据。另外,使用const
声明是很好的,因为您可以立即得出结论,在阅读代码时永远不会重新分配值。
这对于优化也有好处,因为使用常量引用可以减少在底层引擎中取消对其值进行拆箱的调用次数,因为在其生命周期内它将保持相同的类型和相同的引用。
答案 1 :(得分:2)
想想模棱两可。您是await
正在this.getReferenced(...)
还是this....data
?要直接取消引用结果,您需要使用括号将其清除:
let budgets = (await this.getReference(DocStore, AdData, 'budget'))[0].data;
这是否真的比将其分成两行更具可读性,您自己决定。
答案 2 :(得分:1)
const budgets = await this.getReferenced(wipDocStore, facebookAdData, 'budget').then(results => results[0].data)
答案 3 :(得分:0)
你可以做
let budgets = (await this.getReference(DocStore, AdData, 'budget'))[0].data;
但是,如果您只需要属性data
,则这是另一种选择:
let {data} = (await this.getReference(DocStore, AdData, 'budget'))[0]
将data
括在括号中意味着您只想获取名为data
的属性。
但是,按照我个人的观点,这是最好的选择:
let budgets = await this.getReference(DocStore, AdData, 'budget');
let {data} = budgets[0];
答案 4 :(得分:0)
如果您查看以下内容:
您将看到await关键字将等待承诺完成或拒绝。或者,如果您未通过承诺,则立即返回该值。
因此,您有两个选择:传递一个promise或一个值作为表达式,因为await期望一个表达式。
在这里:
let budgets = await this.getReference(DocStore, AdData, 'budget')[0].data
由于它需要一个表达式,因此将首先对该表达式求值,因此返回值是不确定的,因为您正在访问索引为0的函数。
根据规则,如果您将值传递给await关键字,它将立即返回该值。