从连锁承诺中获取价值

时间:2018-11-23 20:47:37

标签: javascript node.js promise google-cloud-firestore

我对诺言确实很陌生,并且试图理解这一点也感到头疼,所以现在我试图从返回诺言的方法中获得答案,然后我在有条件的条件中获取价值并进行其他一些操作

@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()”来获取返回的诺言中的值吗?如果有人可以帮助我,请先谢谢

1 个答案:

答案 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) 
  }
}