ОК, я нашел способ сделать это. Трубопровод к потокам не очень дружелюбен к обещаниям, поэтому я в итоге сделал некоторые ручные манипуляции с обещаниями. Я думаю, что обещание поддержки потоков будет достигать node.js, поскольку у нас уже есть несколько асинхронных c итераторов. В любом случае, вот способ заставить все работать, наблюдая за правильными событиями в ваших потоках:
function dl(url, path, data = null) {
return new Promise((resolve, reject) => {
request.get({
url: url,
}).on("error", function (error) {
console.log(error);
reject(error);
}).on('response', function (res) {
let fileExt = res.headers['content-type'].split('/')[1];
let fileFullPath = `${path}.${fileExt}`;
let writeStream = fs.createWriteStream(fileFullPath);
// set up event handlers to monitor the writeStream for error or completion
writeStream.on('error', reject).on('close', async () => {
if (data) {
try {
await saveInfo(fileFullPath, data);
} catch(e) {
reject(e);
return;
}
}
console.log("file downloaded");
resolve(true);
});
// send the response stream to our file
res.pipe(writeStream).on('error', reject);
});
});
}
async function saveInfo(filePath, data) {
await exiftool.write(filePath, {
Keywords: data.keywords,
Copyright: data.copyright,
});
console.log("Tags are saved");
exiftool.end();
}