首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步/等待运行异步函数在nodejs中按顺序运行

异步/等待运行异步函数在nodejs中按顺序运行
EN

Stack Overflow用户
提问于 2021-12-13 10:00:21
回答 2查看 1.7K关注 0票数 1

问题

我有三个相互依赖的函数,因此我希望它们能够连续运行。调用的函数是异步函数和返回承诺函数,运行起来需要时间。

我的代码- Index.js

代码语言:javascript
复制
#Function One
scrapA.scrap().then(data => {
    readWriteToFile.writeToFile(data, 'scrapA-data-'+timestamp, 'json');
});

#Function Two
compare.compareData('./output/json/data.json', './output/json/scraped-data-'+timestamp+'.json').then(data => {

    let dataWithStockData = data;
    let mapDatas = dataWithStockData.map( obj => { 

        let finalObj = {
            manufacturer: obj.manufacturer,
            grade: obj.condition,
            carrier: obj.carrier,
            stock: obj.stock,
        }
        return finalObj;
    });

#Function Three
readWriteToFile.writeToFile(data, 'data-with-stock-'+timestamp, 'csv'); });

我的代码- compare.js

代码语言:javascript
复制
async function compareData(models, competitorsData) {

try {
    
    const modelsArr = JSON.parse(fs.readFileSync(models, { encoding: 'utf8', flag: 'r' }));
    const competitorsDataArr = JSON.parse(fs.readFileSync(competitorsData, { encoding: 'utf8', flag: 'r' }));

    //Loop through both array of json data
    modelsArr.forEach((device, deviceKey) => {

        competitorsDataArr.forEach((scrapedData, scrapedDataKey) => {

            
            if (
                    scrapedData.manufacturer.toLowerCase() === data.manufacturer.toLowerCase()
            ) {

                 modelsArr[dataKey]['stk'] = scrapedData.stk;

            }
        })
    });

    return modelsArr;

} catch (error) {

    console.log("Error", error);
    throw error;
}

}

我的代码- readWriteToFile.js

代码语言:javascript
复制
async function writeToFile(data, filename, type) {

let finalData = '';

if (type == "json") {

    finalData = JSON.stringify(data);

} else if (type == "csv") {

    finalData = arrayToCSV(data);

} else {
    console.log("File type not supported");
    process.exit(1);
}

fs.writeFile("./output/" + type + '/' + filename + '.' + type, finalData, (err) => {
    if (err) {
        console.log(err);
    } else {
        console.log("File written successfully\n");
    }
});

}

我的解决方案

我简单地将所有函数调用包装在异步中,并在前面添加了“等待”。我不工作,也不抛出任何错误。

代码语言:javascript
复制
(async () => {
    
    await scraperA.scrap().then(data => {
            console.log("DATA", data);
            readWriteToFile.writeToFile(data, 'scraped-data-'+timestamp, 'json');
        });
    
    await compare.compareData('./output/json/data.json', './output/json/scraped-data-'+timestamp+'.json').then(data => {
        let dataWithStockData = data;
        mapData = dataWithStock.map( obj => { 
    
            let finalObj = {
                manufacturer: obj.manufacturer,
                grade: obj.condition,
                stock: obj.stock,
            }
            return finalObj;
        });
    });

    await readWriteToFile.writeToFile(mapData, 'data-with-stock-'+timestamp, 'csv');

});
EN

回答 2

Stack Overflow用户

发布于 2021-12-13 10:27:43

代码结构

代码语言:javascript
复制
(async () => {
    
    /* your code */

});

建议您创建一个异步立即调用函数表达式(IIFE)。但是您必须调用它(最后是()):

代码语言:javascript
复制
(async () => {
    
    /* your code */

})();

使用当前版本的Node.js,您不需要异步生命。Node.js支持顶级等待

由于readWriteToFile.writeToFilecompare.compareData不返回承诺,所以不能调用.then,而await则没有意义。

从Node.js v14.8开始,您可以编写

代码语言:javascript
复制
await scraperA.scrap().then(data => {
    console.log("DATA", data);
    readWriteToFile.writeToFile(data, 'scraped-data-'+timestamp, 'json');
});

const dataWithStockData = compare.compareData('./output/json/data.json', './output/json/scraped-data-'+timestamp+'.json')
mapData = dataWithStock.map( obj => { 

    let finalObj = {
        manufacturer: obj.manufacturer,
        grade: obj.condition,
        stock: obj.stock,
    }
    return finalObj;
});

readWriteToFile.writeToFile(mapData, 'data-with-stock-'+timestamp, 'csv');

修复问题后,可以考虑使用.thenawait / async来清理代码。混合它们通常被认为是糟糕的代码风格。

代码语言:javascript
复制
const data = await scraperA.scrap();
console.log("DATA", data);
readWriteToFile.writeToFile(data, 'scraped-data-'+timestamp, 'json');

const dataWithStockData = compare.compareData('./output/json/data.json', './output/json/scraped-data-'+timestamp+'.json');

mapData = dataWithStock.map( obj => { 

  let finalObj = {
    manufacturer: obj.manufacturer,
    grade: obj.condition,
    stock: obj.stock,
  }
  return finalObj;
});

readWriteToFile.writeToFile(mapData, 'data-with-stock-'+timestamp, 'csv');
票数 1
EN

Stack Overflow用户

发布于 2021-12-13 10:27:50

如果不知道您调用的哪个函数是同步的还是不同步的,就很难回答。但作出以下假设:

  • readWriteToFile.writeToFile返回一个承诺(或者是异步的)
  • mapData是在其他地方定义的

你必须:

  • 将返回语句添加到第一个.then(...)块的最后一行
  • 正如jabaa所说,您必须实际调用该函数。
代码语言:javascript
复制
(async () => {
    
    await scraperA.scrap().then(data => {
            console.log("DATA", data);
            return readWriteToFile.writeToFile(data, 'scraped-data-'+timestamp, 'json');
        });
    
    await compare.compareData('./output/json/data.json', './output/json/scraped-data-'+timestamp+'.json').then(data => {
        let dataWithStockData = data;
        mapData = dataWithStock.map( obj => { 
    
            let finalObj = {
                manufacturer: obj.manufacturer,
                grade: obj.condition,
                stock: obj.stock,
            }
            return finalObj;
        });
    });

    await readWriteToFile.writeToFile(mapData, 'data-with-stock-'+timestamp, 'csv');

})();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70332816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档