Как заставить Node.js ждать вызова функции, содержащей почтовый запрос? - PullRequest
0 голосов
/ 15 марта 2019

Я новичок в Node.js и не могу дождаться завершения кода, чтобы завершить мой вызов askKB, который содержит запрос http.

Мне нужно сначала завершить askKB, чтобы я мог использовать переменную speechTextно код после вызова функции запускается до того, как я получаю speechText обратно.

Я также пытался поиграться с await / async, но безуспешно.

 handle(handlerInput) {
    var newQuestion = handlerInput.requestEnvelope.request.intent.slots.phrase.value;
    const speechText = askKB(newQuestion);// <-- I want this function finish first because I need the variable speechText

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

Вот функция askKB:

function askKB(question){     
  var answer;
  var requestOptions = {
    url: host + route,
    headers: {
      //some code here
    },
    method: "POST",
    json: true,
    json: { "question": question }
  };

  request(requestOptions, function(err, response, body) {
    if (!err && response.statusCode == 200) {     
        answer = body.answers[0].answer;          
    } 
    else {
      answer = "Sorry! something went wrong. Try again...";
    }   
  });
  return answer;
}

Буду признателен за любую помощь:)

1 Ответ

0 голосов
/ 15 марта 2019

Вы можете использовать функции async - await и, конечно, обещания.

Promise - это прокси для значения, которое не обязательно известно при создании обещания.Это позволяет связать обработчики с конечным значением успеха или причиной сбоя асинхронного действия.Это позволяет асинхронным методам возвращать значения подобно синхронным методам: вместо немедленного возврата окончательного значения асинхронный метод возвращает обещание предоставить значение в какой-то момент в будущем.

Обещание находится в одном из следующих состояний:

в ожидании: начальное состояние, не выполнено и не отклонено.выполнено: означает, что операция завершена успешно.отклонено: означает, что операция завершилась неудачно.

Так что это даст вам необходимое время для возврата данных.

Если вы не хотите обещаний, вы все равно можете заставить свой код работать с асинхронными функциями.

async function askKB(question){     
  var answer;
  var requestOptions = {
    url: host + route,
    headers: {
      //some code here
    },
    method: "POST",
    json: true,
    json: { "question": question }
  };

  await(request(requestOptions, function(err, response, body) {
    if (!err && response.statusCode == 200) {     
        answer = body.answers[0].answer;          
    } 
    else {
      answer = "Sorry! something went wrong. Try again...";
    }   
  }));
  return answer;
}
...