node.js - 如何让函数等到我在 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")
}
}
}
解决方案
您正在标准 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")
}
}
}
推荐阅读
- java - How to do this using collections/ stream api
- azure-devops - 为什么我不能在 VSBuild 任务中直接指定多个配置/平台?
- r - 关于 fct_relevel 和 scale_fill_manual
- java - socketio.emit 不起作用 netty socketio
- java - 夸库斯多
不引用字符串 - xamarin - MvvmCross 从 6.4.2 升级到 8.0.1
- sql - 仅选择两列重复时的最后一个日期
- r - 如何使用 dplyr 在 R 中的每个组中查找最大值
- python - python代码中字典问题的问题
- android - Google Fit Android SDK:数据更新监听器也可以用作后台同步触发器吗?