Как дождаться этого запроса JSON, прежде чем перейти к команде welcome intent <speak> - PullRequest
1 голос
/ 04 июня 2019

Я пытаюсь использовать fetch для получения объекта json, и это работает правильно.Затем я присваиваю строку на основе данных и хочу использовать эту строку в ответе ssml ... делая это так, как у меня сейчас, это примерно на 300 мс медленнее и переменная не определена, если я пытаюсь поместитьОтвет ssml в другом месте этого кода приводит к ошибке «Ответ не был установлен».Кто-нибудь может направить меня в правильном направлении, я буквально был над этой проблемой в течение 5 дней подряд (уже отказался от Firestore для поиска данных, так как каждый раз это занимало 30+ секунд каждый раз).

//this is what I have in the Welcome Intent -- I should note that all of this 
//is in a function called welcome() which is called by the welcome intent

function foo() {
  // RETURN the promise
  return fetch("https://webhostapp.com/townsheriff.json")
    .then(function(response){
      return response.json(); // process it inside the `then`
    });
}

foo().then(function(response){
  // access the value inside the `then`
  currentquestion = response[2].n111.toString(); //assigning variable works

  //I tried putting the ssml response here but then got "no response set"
  //error

})


//here it comes up as undefined because it happens 300ms too early
const ssml =
  '<speak>' +
    '<audiosrc="https://test.mp3">You have just been made sheriff...</audio>'+
    currentquestion  +
  '</speak>';

conv.ask(ssml);

1 Ответ

2 голосов
/ 04 июня 2019

Проблема в том, что все , которое вы хотите сделать с результатом вашего вызова API с fetch, должно обрабатываться как часть разрешения Promise. Работа Promises заключается в том, что код после того, как он будет продолжать выполняться при его первоначальном запуске, но то, что находится в блоке then(), будет вызываться после завершения Promise.

Кроме того, вам необходимо убедиться, что вы также вернули обещание, чтобы диспетчер Intent Handler знал, что нужно дождаться выполнения обещания.

Первая часть обрабатывается путем помещения всего, включая вызов conv.ask() в часть then(). Вторая часть обрабатывается путем возврата обещания. Это может выглядеть примерно так:

// Make sure you return this promise
return foo().then(function(response){
  // access the value inside the `then`
  currentquestion = response[2].n111.toString(); //assigning variable works

  // Make sure you build the response, and ask it inside the promise resolution
  const ssml =
    '<speak>' +
    '<audiosrc="https://test.mp3">You have just been made sheriff...</audio>'+
    currentquestion  +
    '</speak>';

  conv.ask(ssml);
});
...