Как заставить функцию ждать, пока я не получу ответ в node.js - PullRequest
0 голосов
/ 16 октября 2018

Async и Await не работают должным образом.Пожалуйста, исправьте меня, где я делаю неправильно в коде.Я читаю данные (url, pagelimit, company) из Excel и, используя 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 голосов
/ 16 октября 2018

Вы выполняете код ожидания внутри стандартного цикла for, который не будет работать синхронно.чтобы запустить async / await внутри цикла for, вы должны использовать цикл 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")
        }
     }
    }
...