首页 > 解决方案 > 全局变量未更新

问题描述

我在这段代码中有问题。
我正在尝试解析一个 excel 文件,但无法建立父关系。
父记录创建成功,子记录也创建了,但是parent_id始终为0

    let parent_id = 0; // this var not updated!!!
    let workbook = new Excel.Workbook()
    workbook = await workbook.xlsx.readFile(location)
    workbook.worksheets[0].eachRow(async (row) => {
        console.log(parent_id) // each time 0,0,0,0
        const name = row.getCell(1).value
        const obj = {
            name,
            number: row.getCell(2).value,
            parent_id: name ? null : parent_id
        }
        if(obj.number && Number(obj.number) == obj.number){
            const node = await LeadNode.create(obj)
            if(name){
                parent_id = node.id
                console.log(parent_id) // work here 1,2,3,4,5
            }
        }
    });

分贝屏幕

标签: node.jsexceljs

解决方案


问题是由于您的回调没有完成.eachRow()而引起的。await

如果您以某种方式使回调 not async,它将起作用。这意味着您必须await LeadNode.create(obj)在回调之外调用它。

可能的解决方案:创建一个数组obj,然后遍历它们并调用await LeadNode(...). 就像是:

let parent_id = 0; // this var not updated!!!
let workbook = new Excel.Workbook()
workbook = await workbook.xlsx.readFile(location)
const objs = [];
workbook.worksheets[0].eachRow((row) => {
    console.log(parent_id) // each time 0,0,0,0
    const name = row.getCell(1).value
    const obj = {
        name,
        number: row.getCell(2).value,
    }
    objs.push(obj);
});

for (const obj of objs){
    if(obj.number && Number(obj.number) == obj.number){
        obj.parent_id = obj.name ? null : parent_id
        const node = await LeadNode.create(obj)
        if(name){
            parent_id = node.id
            console.log(parent_id) // work here 1,2,3,4,5
        }
    }
}

推荐阅读