首页 > 解决方案 > 如何让函数等到我在 node.js 中得到响应

问题描述

Async 和 Await 没有按预期工作。请纠正我在代码中做错的地方。我正在从 excel 中读取数据(url、pagelimit、公司),并使用 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")
            }


    }  

}

标签: node.jscallbackasync-await

解决方案


您正在标准 for 循环中运行 await 代码,该循环不会同步工作。要在 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")
        }
     }
    }

推荐阅读