Как еще можно сделать запрос с обещанием? с nodeJS - PullRequest
0 голосов
/ 10 мая 2019

Здравствуйте! Я хочу подключить своего помощника Уотсона к устройству alexa, для этого мне понадобится набор навыков для разработки Amazon и лямбда-амба AWS. Но я не могу подключиться к Уотсону, потому что у меня возникли проблемы с моими обещаниями, и я не вижу журналы своего кода в консоли разработчика Amazon. А мой помощник работает над приложением nodeJs.

Есть несколько кодов, которые я пробовал:

const MyNameIsIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'SearchIntent';
  },
   async handle(handlerInput) {


      assistant.createSession({
        assistant_id: assistant_id
      })
          .then(res => {
              session_id = res.session_id;
          })
          .catch(err => {
              console.log(err);
          });
        assistant.message({
            assistant_id: assistant_id,
            session_id: session_id,
            input: {
                'message_type': 'text',
                'text': "hello"
            }
        })
            .then(res => {
                console.log(JSON.stringify(res, null, 2));
                 speechText = res.output.generic.response.text;
            })
            .catch(err => {
              speechText = err;
      });


    }, function(err){
      speechText = "Problem with Api call";
    });

    return handlerInput.responseBuilder
      .speak(speechText)
      .getResponse();
  },
};

И другой способ с обещанием:

try{

      let res = await assistant.createSession({
        assistant_id: assistant_id
      });

      session_id = res.session_id;

      let message = await assistant.message({
        assistant_id: assistant_id,
        session_id: session_id,
        input: {
          'message_type': 'text',
          'text': "hello"
        }

      });
      speechText = message.output.generic.response.text;

    }catch(err){
      speechText = err;
    }

Результаты speechText должны дать мне «Добрый день», это ответ от Watson. Но теперь Алекса говорит: «Извините, я не могу понять команду. Пожалуйста, скажите еще раз».

У вас есть другие способы попробовать это с другим способом выполнить обещание? спасибо!

1 Ответ

0 голосов
/ 12 мая 2019

Несколько мыслей для размышления ...

Глядя на первую попытку, вы видите в handle() две независимые цепочки обещаний, по сути такие:

async handle(handlerInput) {
    doSomething_1().then(...).catch(...);
    doSomething_2().then(...).catch(...);
},

По-видимому, вам нужно последовательно выполнить две асинхронные операции:

handle(handlerInput) {
    return doSomething_1().then(doSomething_2)....;
},

В полном объеме (с некоторыми догадками / изобретательностью):

handle(handlerInput) {
    return assistant.createSession({ assistant_id })
    .then(res => {
        return assistant.message({
            'assistant_id': assistant_id, // ??
            'session_id': res.session_id,
            'input': {
                'message_type': 'text',
                'text': 'hello'
            }
        })
        .catch(err => {
            err.message = 'Problem with assistant.message() call';
            throw err; // send error with custom message down the down the error path.
        }
    }, err => {
        err.message = 'Problem with assistant.createSession() call';
        throw err; // send error with custom message down the down the error path.
    }
    .then(res => res.output.generic.response.text) // send res.output.generic.response.text down the success path.
    .catch(err => err.message) // catch error from anywhere above and send err.message down the success path to appear as `speechText` below.
    .then(speechText => { // `speechText` is the text delivered by the immediately preceeding .then() or .catch()
        return handlerInput.responseBuilder
        .speak(speechText)
        .getResponse();
    })
    .catch(err => { // in case handlerInput.responseBuilder.speak().getResponse() throws
        console.log(err);
    });
}

Примечания:

  1. текст передается по пути успеха цепочки обещаний и отображается как speechText в последнем .then(); нет необходимости во внешней переменной.
  2. Пользовательские сообщения об ошибках (при необходимости) вводятся с промежуточными уловками, которые изменяют и (что важно) сбрасывают их ошибки.
  3. третий промежуточный перехват перехватывает путь ошибки и отправляет сообщение об ошибке err.message по пути успеха.
  4. потребление speechText обязательно зависит от завершенной последовательности assistant.message().then(assistant.message).
  5. код может быть написан с помощью async / await, но отличается только семантикой; обе версии будут использовать обещания.

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

Удачи с этим.

...