reactjs - 当要返回的对象在其中更新时,如何使异步函数按顺序工作
问题描述
我正在尝试更新我的异步函数中的地图,因此我希望仅在执行循环但首先返回未定义的值时才返回地图,这会破坏我的代码。如何推迟这个退货声明?
async function getResourceDataMap(stationCode, event) {
let file = event.target.files[0];
let sheetIndexMap = await readXlsxFile(file, { getSheets : true} );
let resourceDataMap = {};
/*
Consider all the sheets
*/
sheetIndexMap.map(async (sheet) => {
let sheetName = sheet.name;
if(isSheetNameValid(sheetName)) {
console.log("Entered for sheetName::" + sheetName);
let sheetRows = await readXlsxFile(file, { sheet: sheetName });
if (sheetRows != null && sheetRows.length > 1) { // we need atleast two rows
let headers = sheetRows[0];
console.log("header obtained is:" +headers);
if(isColumnNamesValid(sheetName, headers)) {
let sheetMapList = getSheetMap(sheetRows);
console.log("SheetMapList obtained is:" + sheetMapList);
// STEP : Create a map of the various sheets (corresponding to each resource type)
console.log("SheetName here is::::::::" +sheetName);
resourceDataMap[sheetName] = {
headerRows: headers,
sheetMapList : sheetMapList
};
console.log("Resource data Map within :" + resourceDataMap["PRE_STAGING_AREA"]);
}
}
}
})
console.log("Resource data Map HEREEEE :" + resourceDataMap["PRE_STAGING_AREA"]);
return resourceDataMap;
}
resourceDataMap 正在这里更新。
解决方案
您正在使用它返回承诺数组的async
回调。map
因此,将 promise 数组存储在一个变量中,然后在最后执行 Promise.all。
像这样
async function getResourceDataMap(stationCode, event) {
let file = event.target.files[0];
let sheetIndexMap = await readXlsxFile(file, { getSheets: true });
let resourceDataMap = {};
const promiseArr = sheetIndexMap.map(async (sheet) => { //<---- store array of promises obtained by map in a variable
let sheetName = sheet.name;
if (isSheetNameValid(sheetName)) {
console.log("Entered for sheetName::" + sheetName);
let sheetRows = await readXlsxFile(file, { sheet: sheetName });
if (sheetRows != null && sheetRows.length > 1) {
// we need atleast two rows
let headers = sheetRows[0];
console.log("header obtained is:" + headers);
if (isColumnNamesValid(sheetName, headers)) {
let sheetMapList = getSheetMap(sheetRows);
console.log("SheetMapList obtained is:" + sheetMapList);
// STEP : Create a map of the various sheets (corresponding to each resource type)
console.log("SheetName here is::::::::" + sheetName);
resourceDataMap[sheetName] = {
headerRows: headers,
sheetMapList: sheetMapList,
};
console.log(
"Resource data Map within :" + resourceDataMap["PRE_STAGING_AREA"]
);
}
}
}
});
return Promise.all(promiseArr).then(x => { //<----make sure to do return here
console.log(
"Resource data Map HEREEEE :" + resourceDataMap["PRE_STAGING_AREA"]
);
return resourceDataMap;
})
}
推荐阅读
- sql - 尝试通过累积变量来更新sql中的临时表
- swift - 如果 .navigationBarItems 存在,则列表部分无法正常工作
- postgresql - 如何使用 Objection JS 检查数组列是否包含 Postgres 中的值?
- python - 蟒蛇太空入侵者克隆敌人的运动
- java - 如何使用 JpaSpecificationExecutorWithProjection 的 findAll 方法基于“AND”运算符而不是“LIKE”获取数据?
- android - 当可调用的firebase函数抛出异常时防止android应用程序崩溃
- python - python格式的字符串内的字符串内的字符串
- python - 如何在 django 中从数据库中查询图像
- android - 谷歌地图上的TextFormField?
- c# - 运行存储过程并检查值是否存在 C#