如何使函数等到在node.js中得到响应

时间:2018-10-16 13:24:31

标签: node.js callback async-await

异步和等待未按预期方式工作。请更正我在代码做错的地方。 我正在从excel读取数据(URL,pagelimit,company),并使用switch()导航到该服务。 我必须等到从此函数cnbservice.GetcnbOpenings(url,pageLimit,company)获得响应,将响应存储到全局数组并调用此函数mdsservice.GetMdsOpenings(url,pageLimit,company),然后将结果附加到全局数组。

    const readexcel = async (request, response) => {

    const workbook = XLSX.readFile('file.xlsx');
    const sheetnamelist = workbook.SheetNames;
    var xldata = XLSX.utils.sheet_to_json(workbook.Sheets[sheetnamelist[0]]);
    dataarray =[];
    for (i = 0; i < xldata.length; i++) {
        company = xldata[i].company;
        url = xldata[i].careers_link_url;
        pageLimit = xldata[i].pagelimit;       

        switch(company){
        case process.env.cnb_company_name:        
          const arr = await cnbservice.GetcnbOpenings(url, pageLimit,company)
          if(arr !== undefined){
            dataarray.push(arr);
        }
            break;
        case process.env.mds_company_name:
        const arr1 = await mdsservice.GetMdsOpenings(url, pageLimit,company)    
        if(arr1 !== undefined){    
        dataarray.push(arr1);
    }
            break;
        case "default":
            console.log("Company Name not matching with any of the services")
            }


    }  

}

1 个答案:

答案 0 :(得分:0)

您正在标准for循环内运行等待代码,该代码无法同步工作。要在for循环中运行async / await,您应该使用for...of循环。

 for(let element of array){
  //await call
  }

进行以下更改后,您的代码将按预期工作。

const readexcel = async (request, response) => {

    const workbook = XLSX.readFile('file.xlsx');
    const sheetnamelist = workbook.SheetNames;
    var xldata = XLSX.utils.sheet_to_json(workbook.Sheets[sheetnamelist[0]]);
    dataarray = [];
    for (let element of xldata) {
        company = element.company;
        url = element.careers_link_url;
        pageLimit = element.pagelimit;

        switch (company) {
            case process.env.cnb_company_name:
                const arr = await cnbservice.GetcnbOpenings(url, pageLimit, company)
                if (arr !== undefined) {
                    dataarray.push(arr);
                }
                break;
            case process.env.mds_company_name:
                const arr1 = await mdsservice.GetMdsOpenings(url, pageLimit, company)
                if (arr1 !== undefined) {
                    dataarray.push(arr1);
                }
                break;
            case "default":
                console.log("Company Name not matching with any of the services")
        }
     }
    }