从Firestore获得价值需要时间

时间:2019-03-02 12:09:07

标签: node.js google-cloud-firestore dialogflow

问题是对google操作的响应完成后,数据库中的值已更新,我尝试了几个选项来使函数等待值更新,但它不起作用, 我需要执行两次以获取正确的值log

function operation(callback) {
  dialogflowAgentDoc.doc(format).get()
  .then(doc => {
      console.log(doc.data().Url);
      Url = doc.data().Url;
  })
  .catch((err) => {
    console.log('Error getting documents', err);
  });
    callback(Url);
}

app.intent("Default Welcome Intent", conv => {
   new GetFormat();
   console.log("GetFormat Started");
   new operation(function(Url) {
    console.log("Ask Started");
        conv.ask(
	new SimpleResponse({
        speech: "Playing Gallay Tzahal",
        text: "Playing Gallay Tzahal"
    }),
  new MediaObject({
        name: 'Gallay Tzahal News',
        url: Url,
        description: "text",
        icon: new Image({
            url: 'https://upload.wikimedia.org/wikipedia/he/thumb/3/30/GaltzLogo.svg/150px-GaltzLogo.svg.png',
            alt: 'Media icon',
        }),
    })
	);
   });
   conv.ask(suggestions3);
});

1 个答案:

答案 0 :(得分:1)

从云中加载数据需要花费很多时间。为了防止在等待数据时阻止应用程序,Firestore(和大多数现代的Web API)会异步加载数据,然后在数据可用时调用传递给then()的函数。

这意味着需要Firestore中的数据的代码必须位于then()回调的内部 ,该回调在数据可用时被调用。所以:

function operation(callback) {
  dialogflowAgentDoc.doc(format).get()
  .then(doc => {
      console.log(doc.data().Url);
      Url = doc.data().Url;
      callback(Url);
  })
  .catch((err) => {
    console.log('Error getting documents', err);
  });
}