我是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;
}
我将不胜感激:)
答案 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;
}