问题
我有三个相互依赖的函数,因此我希望它们能够连续运行。调用的函数是异步函数和返回承诺函数,运行起来需要时间。
我的代码- Index.js
#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
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
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");
}
});}
我的解决方案
我简单地将所有函数调用包装在异步中,并在前面添加了“等待”。我不工作,也不抛出任何错误。
(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');
});发布于 2021-12-13 10:27:43
代码结构
(async () => {
/* your code */
});建议您创建一个异步立即调用函数表达式(IIFE)。但是您必须调用它(最后是()):
(async () => {
/* your code */
})();使用当前版本的Node.js,您不需要异步生命。Node.js支持顶级等待。
由于readWriteToFile.writeToFile和compare.compareData不返回承诺,所以不能调用.then,而await则没有意义。
从Node.js v14.8开始,您可以编写
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');修复问题后,可以考虑使用.then或await / async来清理代码。混合它们通常被认为是糟糕的代码风格。
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');发布于 2021-12-13 10:27:50
如果不知道您调用的哪个函数是同步的还是不同步的,就很难回答。但作出以下假设:
你必须:
.then(...)块的最后一行(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');
})();https://stackoverflow.com/questions/70332816
复制相似问题