如何正确使用 Alexa skill 中的异步函数?
How to use async functions within Alexa skill properly?
我是异步编程的新手,所以请原谅我缺乏理解,但我目前正在构建一个调用私人停车场的 Alexa 技能 API。你可以调用这个API,它会给你最近的停车位。
const getParkingSpots_Handler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'getParkingSpots' ;
},
handle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
const responseBuilder = handlerInput.responseBuilder;
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
let requestData = {
// I can't show this sorry
}
let options = {
// I can't show this sorry
};
// Call to the API
const postAxios = async () => {
try {
const response = await axios.post(API_URL, requestData, options);
return response.data.result;
} catch(error) {
console.log(error);
}
};
// Another function. This is where I use the data from the API response. I intent to add some code here that only picks out a number of results, sorts it by price etc. etc.
const useTheResult = async () => {
const result = await postAxios();
console.log('Response from the API:', result);
};
// We defined the functions above, now we need to execute them
useTheResult();
// This is what we will refer to the 'problem code'.
let say = `Hello from confidientialCompany! You can park...`;
return responseBuilder
.speak(say)
.reprompt('try again, ' + say)
.getResponse();
},
};
理想情况下,一旦我添加代码以修改 useTheResult
内的响应,我希望问题代码也位于 useTheResult
内...为什么?因为一旦我选择了我想要的数据并对其进行了修改,我就会尝试将 say 变成一个 'Alexa-readable' 句子,例如:
let say = `Hello from confidentialCompany! You can park on ${roadName1}, ${roadName2} and ${roadName3}. Prices start from ${startingPrice} pounds.`
如果我现在这样做,我会在 Alexa 控制台中测试时收到错误消息。我不知道该怎么办了,我觉得我要陷入异步函数的无限循环中了。
将async
关键字添加到handle
方法名称并在里面使用await
:
const getParkingSpots_Handler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'getParkingSpots' ;
},
async handle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
const responseBuilder = handlerInput.responseBuilder;
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
let requestData = {
// I can't show this sorry
}
let options = {
// I can't show this sorry
};
// Call to the API
let result = null;
try {
const response = await axios.post(API_URL, requestData, options);
result = response.data.result;
} catch(error) {
// handle this case and return some message to User
console.log(error);
}
// assume your data structure to be like:
/**
result: {
roadName1: "1st street",
roadName2: "2nd street",
roadName3: "3rd street",
startingPrice: "1.2"
}
*/
const {roadName1, roadName2, roadName3, startingPrice} = result;
// This is what we will refer to the 'problem code'.
let say = `Hello from confidentialCompany! You can park on ${roadName1}, ${roadName2} and ${roadName3}. Prices start from ${startingPrice} pounds.`;
return responseBuilder
.speak(say)
.reprompt('try again, ' + say)
.getResponse();
},
};
如果你想在同一个函数中做更多的调用:
try {
const [response1, response2] = await Promise.all([
axios.post(API_URL1, requestData, options),
axios.post(API_URL2, requestData, options)
]);
// do things with your responses
// ...
} catch(error) {
// handle this case and return some message to User
console.log(error);
}
我是异步编程的新手,所以请原谅我缺乏理解,但我目前正在构建一个调用私人停车场的 Alexa 技能 API。你可以调用这个API,它会给你最近的停车位。
const getParkingSpots_Handler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'getParkingSpots' ;
},
handle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
const responseBuilder = handlerInput.responseBuilder;
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
let requestData = {
// I can't show this sorry
}
let options = {
// I can't show this sorry
};
// Call to the API
const postAxios = async () => {
try {
const response = await axios.post(API_URL, requestData, options);
return response.data.result;
} catch(error) {
console.log(error);
}
};
// Another function. This is where I use the data from the API response. I intent to add some code here that only picks out a number of results, sorts it by price etc. etc.
const useTheResult = async () => {
const result = await postAxios();
console.log('Response from the API:', result);
};
// We defined the functions above, now we need to execute them
useTheResult();
// This is what we will refer to the 'problem code'.
let say = `Hello from confidientialCompany! You can park...`;
return responseBuilder
.speak(say)
.reprompt('try again, ' + say)
.getResponse();
},
};
理想情况下,一旦我添加代码以修改 useTheResult
内的响应,我希望问题代码也位于 useTheResult
内...为什么?因为一旦我选择了我想要的数据并对其进行了修改,我就会尝试将 say 变成一个 'Alexa-readable' 句子,例如:
let say = `Hello from confidentialCompany! You can park on ${roadName1}, ${roadName2} and ${roadName3}. Prices start from ${startingPrice} pounds.`
如果我现在这样做,我会在 Alexa 控制台中测试时收到错误消息。我不知道该怎么办了,我觉得我要陷入异步函数的无限循环中了。
将async
关键字添加到handle
方法名称并在里面使用await
:
const getParkingSpots_Handler = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return request.type === 'IntentRequest' && request.intent.name === 'getParkingSpots' ;
},
async handle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
const responseBuilder = handlerInput.responseBuilder;
let sessionAttributes = handlerInput.attributesManager.getSessionAttributes();
let requestData = {
// I can't show this sorry
}
let options = {
// I can't show this sorry
};
// Call to the API
let result = null;
try {
const response = await axios.post(API_URL, requestData, options);
result = response.data.result;
} catch(error) {
// handle this case and return some message to User
console.log(error);
}
// assume your data structure to be like:
/**
result: {
roadName1: "1st street",
roadName2: "2nd street",
roadName3: "3rd street",
startingPrice: "1.2"
}
*/
const {roadName1, roadName2, roadName3, startingPrice} = result;
// This is what we will refer to the 'problem code'.
let say = `Hello from confidentialCompany! You can park on ${roadName1}, ${roadName2} and ${roadName3}. Prices start from ${startingPrice} pounds.`;
return responseBuilder
.speak(say)
.reprompt('try again, ' + say)
.getResponse();
},
};
如果你想在同一个函数中做更多的调用:
try {
const [response1, response2] = await Promise.all([
axios.post(API_URL1, requestData, options),
axios.post(API_URL2, requestData, options)
]);
// do things with your responses
// ...
} catch(error) {
// handle this case and return some message to User
console.log(error);
}