如何使Node.js等待包含发布请求的函数调用?

时间:2019-03-15 01:05:12

标签: node.js async-await request wait

我是Node.js的新手,我无法等待代码结束对包含http请求的askKB的调用。

我需要先完成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 :(得分:0)

您可以使用异步-等待功能,当然还有诺言。

Promise是创建Promise时不一定知道的值的代理。它允许您将处理程序与异步操作的最终成功值或失败原因相关联。这样一来,异步方法就可以像同步方法一样返回值:与立即返回最终值不同,异步方法返回了在将来某个时刻提供值的承诺。

诺言处于以下状态之一:

pending:初始状态,既未实现也不被拒绝。 完成:表示操作成功完成。 拒绝:表示操作失败。

因此,这将为您提供返回数据之前所需的时间。

如果您不希望获得承诺,仍然可以使代码与异步函数一起工作。

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;
}