我对诺言确实很陌生,并且试图理解这一点也感到头疼,所以现在我试图从返回诺言的方法中获得答案,然后我在有条件的条件中获取价值并进行其他一些操作>
@TestPropertySource("classpath:consumer.properties")
public class ConfigsServiceTest {
@Mock
ConsumerConfig consumerConfig;
@InjectMocks
ConfigsService configService;
@Before
public void beforeEach() {
MockitoAnnotations.initMocks(this);
}
@Test
public void someTest() {
System.out.println(configService.getConfig().getHostname()); //outputs null here -- wth!
Assert.assertTrue(true);
}
}
方法“ checkCategoryExists”是对Firestore数据库的查询。当我尝试检查结果变量是true还是false时,它恰好是未定义的。它不是用“ .then()”来获取返回的诺言中的值吗?如果有人可以帮助我,请先谢谢
答案 0 :(得分:0)
因此,如上所述,我认为您的问题是基于不返回文档搜索结果而造成的,因此下面的两个示例都可以解决该问题。
我还注意到您在函数上使用了异步标记,但从未使用过await,因此我想举两个例子,说明您是否想使用Async / Await,但不确定如何使用。
在promise链示例中,我依靠箭头函数的语法来创建返回值(没有{}
表示等式的右边),因为给定的代码都不需要在返回之前进行数据操作(如果您的实际的代码需求当然应该使用方括号并记住您的return语句:D)
如果选择使用Async / Await,则可以使代码的结构更接近于同步示例,并使用try catch语句。有时,如果在返回结果之前必须进行大量处理/操作,我会发现这种语法更清晰。
祝你好运:)!
// Promise Chains
const addService = (req, res) =>
checkCategoryExists(param)
.then(result => /* do stuff */)
.catch(err => console.error(err.message));
const checkCategoryExists = param =>
db.collection(collectionName.doc(param)
.get()
.then(categoryDoc =>
Promise.resolve((categoryDoc.exists && categoryDoc.data().param === param))
);
// OR using Async/Await
const addService async (req, res) => {
try {
const catExists = await checkCategoryExists(param);
if (!catExists) {
throw new Error('error code');
}
// Do Stuff.
} catch (error) {
console.error(error);
}
};
const checkCategoryExists = async param => {
try {
const docs = await db.collection(collectionName)
.doc(param)
.get();
return (docs.exists && docs.data().param === param);
} catch (error) {
console.error(error)
}
}