我有一个包含 Promise 的 for 循环数组,因此我使用 Promise.all 来遍历它们,并在之后调用 then 方法。
let promises = [];
promises.push(promise1);
promises.push(promise2);
promises.push(promise3);
Promise.all(promises).then((responses) => {
for (let i = 0; i < promises.length; i++) {
if (promise.property === something) {
//do something
} else {
let file = fs.createWriteStream('./hello.pdf');
let stream = responses[i].pipe(file);
/*
I WANT THE PIPING AND THE FOLLOWING CODE
TO RUN BEFORE NEXT ITERATION OF FOR LOOP
*/
stream.on('finish', () => {
//extract the text out of the pdf
extract(filePath, {splitPages: false}, (err, text) => {
if (err) {
console.log(err);
} else {
arrayOfDocuments[i].text_contents = text;
}
});
});
}
}
promise1,promise2和promise3是一些HTTP请求。如果其中一个请求的响应类型是application/pdf,则将其写入流中并解析其中的文本。但是,这段代码在解析PDF文本之前就开始了下一次迭代。有没有办法使代码在移动到下一次迭代之前等待流传输和文本提取完成?
finish
事件只有在调用方正确处理流时才会触发。如果没有正确处理(例如 AWS SDK S3 上传),则可以使用close
事件代替以避免await
永远挂起。 - Malvineousreturn new Promise()
和await new Promise()
之间的区别吗?在你的代码示例中,我相信前者不会产生暂停程序执行的期望效果,直到每个迭代的完成事件都已触发,而后者则会。为什么会这样呢?(在我的特定情况下,我正在循环中使用readable.pipe(writable)
,并发现除非我将管道包装在await new Promise()
中,否则迭代不会暂停) - user1063287pipe
完成。因此,您将按顺序一个接一个地传输流。 - Sarsaparilla