Javascript reduce中的fs.writeFile与fetch存在问题
我需要一些关于我正在写作的助手的帮助。由于某种原因,在读取文件的异步中使用reduce时,当尝试将结果写入文件时,它不会前进到数组的下一项。但是,如果我使用console.log,它就可以正常工作Javascript reduce中的fs.writeFile与fetch存在问题,javascript,node.js,async-await,fetch,reduce,Javascript,Node.js,Async Await,Fetch,Reduce,我需要一些关于我正在写作的助手的帮助。由于某种原因,在读取文件的异步中使用reduce时,当尝试将结果写入文件时,它不会前进到数组的下一项。但是,如果我使用console.log,它就可以正常工作 const neatCsv = require('neat-csv'); const fetch = require('node-fetch'); const fs = require('fs'); fs.readFile('./codes.csv', async (err, data) =>
const neatCsv = require('neat-csv');
const fetch = require('node-fetch');
const fs = require('fs');
fs.readFile('./codes.csv', async (err, data) => {
if (err) { throw err; }
let baseUrl = 'https://hostname/orders?from=2019-10-21T00:00:00.001Z&to=2019-12-31T23:59:59.000Z&promo=';
const starterPromise = Promise.resolve(null);
const promos = await neatCsv(data);
const logger = (item, result) => console.log(item, result);
function write (item, result) {
return new Promise((resolve, reject) => {
fs.writeFile(`./output/${item.PROMO}.json`, JSON.stringify(result), (err) => {
if (err) { throw err; }
console.log(`Wrote file ${item.PROMO}`);
});
})
}
function asyncFetch(item) {
console.log(`runTask <---------${item.PROMO}---------`);
return fetch(`${baseUrl}${item.PROMO}`, { headers: { 'x-apikey': 'xyz' }})
.then(res => (res.json())
.then(json => json))
}
await promos.reduce(
(p, item) => p.then(() => asyncFetch(item).then(result => write(item, result))),
starterPromise
)
});
我们的目标是迭代这些,进行REST调用以获得json结果,并将这些结果写入具有当前promo名称的文件,然后移动到下一个文件,进行新调用并将其保存到不同的文件及其各自的代码中
在reduce中,如果调用logger而不是write,那么它可以正常工作。调用write,它只是一遍又一遍地进行相同的调用,并覆盖同一个文件,迫使我杀死它。请帮帮我,我在这里疯了…您可能会在任何地方使用
async
函数,而fs
承诺使用API和简单的while循环来使用CSV项目。干编码,自然,因为我没有你的CSV或API
(您最初的问题可能是由于您没有在write
函数中解决
/拒绝
,但也不需要reduce hell…)
const neatCsv=require(“整洁csv”);
const fetch=require(“节点获取”);
const fsp=要求(“fs”)承诺;
const logger=(项,结果)=>console.log(项,结果);
常量baseUrl=”https://hostname/orders?from=2019-10-21T00:00:00.001Z&to=2019-12-31T23:59:59.000Z&promo=“;
异步函数asyncFetch(项){
console.log(`runTask{
console.log(“完成!”);
});
使用模拟数据和JSON占位符服务的版本运行良好:
const fetch=require(“节点提取”);
const fsp=要求(“fs”)承诺;
常量baseUrl=”https://jsonplaceholder.typicode.com/comments/";
异步函数asyncFetch(项){
console.log(`runTask{
console.log(“完成!”);
});
不幸的是,这也发生了同样的事情。我认为这是一个竞争条件。用我的api尝试你的代码,它也会发生同样的事情。当我用模拟服务()尝试它时,它会起作用。只要确保你删除${item.PROMO}我不能准确地分享api的安全细节,希望你能理解。不过这很有帮助。有趣的是,它从未真正完成,只是在promos数组的长度上不断循环。如果它与mock一起工作,你确定你调用的服务正确吗?100%正确。它写入了第一个文件和响应就在那里。也许是我的响应的大小?我添加了另一个版本(使用硬编码的“CSV”)还有模拟服务——我真的不知道该告诉你什么,它工作得很好。你在哪个平台上,哪个节点版本?谢谢。我现在在v10.15.3上。我发现了问题,我让nodemon运行以在保存时重新运行。writeFile触发了一个保存,导致重新加载脚本…愚蠢。我的原始脚本工作得很好很有趣,它在一些writeFile场景中工作。无论如何,再次感谢你的帮助!
PROMO
12345
56789
98765
...
const neatCsv = require("neat-csv");
const fetch = require("node-fetch");
const fsp = require("fs").promises;
const logger = (item, result) => console.log(item, result);
const baseUrl = "https://hostname/orders?from=2019-10-21T00:00:00.001Z&to=2019-12-31T23:59:59.000Z&promo=";
async function asyncFetch(item) {
console.log(`runTask <---------${item.PROMO}---------`);
const res = await fetch(`${baseUrl}${item.PROMO}`, { headers: { "x-apikey": "xyz" } });
const json = await res.json();
return json;
}
async function write(item, result) {
await fsp.writeFile(`./output/${item.PROMO}.json`, JSON.stringify(result));
console.log(`Wrote file ${item.PROMO}`);
}
async function process() {
const data = await fsp.readFile("./codes.csv");
const promos = await neatCsv(data);
while (promos.length) {
const item = promos.shift();
const result = await asyncFetch(item);
await write(item, result);
}
}
process().then(() => {
console.log("done!");
});