我有一个带有一些需要异步的函数的类,但是在函数名称前添加异步会在编译时给我一个错误。 (仅使用一个功能atm进行测试)
class cataAPIService {
async getRouteDetails(route) {
var busID;
for(var i = 0; i < catabusRoutes.BUS_ROUTE_ID.buses.length; i++) {
if(catabusRoutes.BUS_ROUTE_ID.buses[i].name === route) {
busID = catabusRoutes.BUS_ROUTE_ID.buses[i].id;
console.log("Got bus id: " + busID);
}
}
var deferred = Promise.defer();
try {
const data = await axios.get("https://realtime.catabus.com/InfoPoint/rest/RouteDetails/Get/" + route);
console.log(data)
deferred.resolve(data)
} catch (error) {
console.log("Error in API call")
deferred.reject(error)
}
return deferred.promise
}
删除异步程序效果很好,但是我失去了所需的功能。我是在犯一个愚蠢的错误并错过了它吗?谢谢
控制台错误图片:
答案 0 :(得分:5)
默认情况下,功能会部署到节点6(您可以在控制台输出中看到)。节点6不支持异步/等待语法。如果要使用异步/等待,则必须使用deploy to node 8(在Beta中),或使用诸如TypeScript之类的转译语言。
答案 1 :(得分:1)
这是正确的语法。从节点8开始,完全支持异步功能。只有使用旧版本的节点时,才会发生语法错误。如果可能,应将节点更新到较新的版本。
该代码使用deferred antipattern,并且不需要async
函数。可能是:
async getRouteDetails(route) {
var busID;
for(var i = 0; i < catabusRoutes.BUS_ROUTE_ID.buses.length; i++) {
if(catabusRoutes.BUS_ROUTE_ID.buses[i].name === route) {
busID = catabusRoutes.BUS_ROUTE_ID.buses[i].id;
console.log("Got bus id: " + busID);
}
}
return axios.get("https://realtime.catabus.com/InfoPoint/rest/RouteDetails/Get/" + route)
.then(data => {
console.log(data);
return data;
})
.catch(error => {
console.log("Error in API call");
throw error;
});
}
答案 2 :(得分:1)
检查您的Node.js版本。
早于7.6版的Node版本不支持异步功能。
您需要将代码(例如,使用Babel)转换为Node可以识别的JS版本(如果您使用的是旧版本)。