Как правильно вернуть ответ на это обещание? - PullRequest
0 голосов
/ 09 марта 2019

Я пишу голосовое приложение для платформ Amazon Alexa и Google Assistant с использованием инфраструктуры Jovo Node.js. Я делаю вложенные http-запросы к внешнему API (первый вызов - получить идентификатор ресурса, необходимый в качестве параметра для второго вызова API). Как только данные вернутся, я хочу отправить ответ пользователю приложения. Однако я не получаю никакого ответа во время тестов.

Я попытался отправить ответ из того же .then (), где я получаю данные из API и сформулировал ответ. Я также попытался просто вернуть этот ответ в объект и связать другой .then (), чтобы обработать это обещание, когда я пытаюсь отправить ответ. Ни один из этих вариантов не работает.

Я console.logged "this" в обработчике запросов, затем внутри .then (), обрабатывающей первый вызов API, и в .then (), обрабатывающей второй вызов API (просто чтобы убедиться, что контекст был тем же ) и это было то же самое "это".

console.logging данных, полученных от API, также работает, поэтому я знаю, что я получаю ответ от API. У меня просто проблемы с отправкой ответа пользователю.

Ниже мой код:

meetup.GetMeetupGroup(city).then((details) => {
    const id = details.next_event.id;
    console.log(id); // This works

    meetup.GetMeetupEvent(city, id).then((event) => {
        let response = {};
        response.speech = `<speak>The next learn to code meetup is ${event.name}.
                    It will be held on <say-as interpret-as="date">${event.local_date}</say-as>
                    at ${event.local_time} at ${event.venue.name}, which is located at
                    <say-as interpret-as="address">${event.venue.address_1}</say-as>. ${event.plain_text_description}. 
                    Would you like to <say-as interpret-as="characters">RSVP</say-as>?</speak>`;

        response.reprompt = `<speak>The next ${city} meetup will be on 
                    <say-as interpret-as="date">${event.local_date}</say-as>
                    at ${event.local_time} at ${event.venue.name},
                    <say-as interpret-as="address">${event.venue.address_1}</say-as>.
                    Do you want to go?</speak>`;
        console.log(response); // This works
        return response;

    }).then((res) => {
        console.log(res); // This works
        this.ask(res.speech, res.reprompt); // Here is where I'm attempting to send a response
    });
}).catch((error) => {
    console.log('Meetup API Error');
    console.log(error);
    this.tell('Sorry, your request could not be completed at this time.');
});
...