我正在研究Alexa技能,在我的一个意图中,我正在使用请求库进行获取请求。我正在传递一个回调函数来处理响应,但是如果我在回调函数中执行responsebuilder.speak它就不起作用。如果我将responsebuilder.speak放在回调之外它可以工作,但它会在我的响应准备好之前执行。
在此我得到以下错误:“消息”:“SpeechletResponse为空”这是有道理的,因为我认为这需要在回调函数之外,但是如何在完成后如何让alexa说出呼叫响应我无法在回调中做到这一点,我在上面尝试了类似的使用.then on request-promise。
const myTestIntent_Handler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'getPsGames' ;
},
handle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
const responseBuilder = handlerInput.responseBuilder;
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
let say = 'Hola desde prueba ';
var finalstr = '';
req(options2, function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(error + ' ' + response.statusCode);
say = 'response valido';
return responseBuilder
.speak('response valido desde callback')
.reprompt('try again, ' + say)
.getResponse();
console.log('final del callback');
}
})
}
};
嗨Rodolfo欢迎来到SO。
您可以将句柄设置为异步并等待,直到返回promise。然后将结果返回给Alexa。这是一个例子:
const getPsGames = {
canHandle(handlerInput) {
return (handlerInput.requestEnvelope.request.type === 'IntentRequest' &&
handlerInput.requestEnvelope.request.intent.name === 'getPsGames');
},
async handle(handlerInput) {
let say = 'Hola desde prueba ';
await getData(url)
.then((response) => {
console.log(response.statusCode);
say = 'response valido';
})
.catch((err) => {console.log(err)}
let response = handlerInput.responseBuilder
return response
.speak(say)
.getResponse();
}
}
const getData = function (url) {
return new Promise((resolve, reject) => {
const client = url.startsWith('https') ? require('https') : require('http');
const request = client.get(url, (response) => {
if (response.statusCode < 200 || response.statusCode > 299) {
reject(new Error('Failed with status code: ' + response.statusCode));
}
const body = [];
response.on('data', (chunk) => body.push(chunk));
response.on('end', () => resolve(body.join('')));
});
request.on('error', (err) => reject(err))
})
};
请求处理程序需要async
然后你可以await
回复并回复。
const req = require("request");
const apiRequest = () => {
const options2 = {
method: "GET",
uri: "http://libgen.io/json.php?ids=1,2&fields=Title,Author,MD5" //sample request
};
let say = "Hola desde prueba ";
return new Promise((resolve, reject) => {
req(options2, function(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(error + " " + response.statusCode);
say = "response valido";
resolve(say);
}
});
});
};
const myTestIntent_Handler = {
canHandle(handlerInput) {
return (
handlerInput.requestEnvelope.request.type === "IntentRequest" &&
handlerInput.requestEnvelope.request.intent.name === "getPsGames"
);
},
async handle(handlerInput) {
const data = await apiRequest();
const speechText = data;
return handlerInput.responseBuilder
.speak(speechText)
.reprompt(speechText)
.getResponse();
}
};