时间:2018-10-31 07:30:30

标签: node.js firebase asynchronous actions-on-google

我有一个带有一些需要异步的函数的类,但是在函数名称前添加异步会在编译时给我一个错误。 (仅使用一个功能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
}

删除异步程序效果很好,但是我失去了所需的功能。我是在犯一个愚蠢的错误并错过了它吗?谢谢

控制台错误图片:

Error Message

3 个答案:

答案 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版本(如果您使用的是旧版本)。