使用 util.promisify 和 async/await 循环中的流管道有什么问题
what is wrong with this stream pipeline in a loop using util.promisify and async/await
我有一组图片网址。我尝试循环加载它们,调整它们的大小并保存到文件系统。
首先我遇到了问题,那个请求只是实现流接口,但我不能像这样直接在管道中使用它:await pipeline(request, imgstream, writableStream) - 通过将请求与管道结合解决了这个问题。
代码如下:
async function processImage(url) {
try {
const pipeline = util.promisify(stream.pipeline);
const resizeTransform = sharp()
.resize(160, 105);
const imgstream = request(url).pipe(resizeTransform);
const localFile = getLocalUrl(url);
const writableStream = fs.createWriteStream(localFile);
await pipeline(imgstream, writableStream);
} catch (err) {
console.log(err);
}
}
urlArr.forEach(processImage);
如果我 运行 这有 100 张图像,它可以很好地处理 30...50 张图像,但其余图像的文件大小为 0 字节,控制台打印如下:
错误:读取 ECONNRESET
在 TCP.onStreamRead (internal/stream_base_commons.js:162:27)
我目前使用的是 win 10 计算机。
代码可能有什么问题?
实际上你的代码是错误的。您正在调用 urlArr.forEach(processImage);
,因为 processImage
是一个 异步 函数,forEach
的默认实现不会 await
作为范围。你需要这样的东西来 await
函数:
for(let i=0; i< urlArr.length; i++){
await processImage(urlArr[i]);
}
我有一组图片网址。我尝试循环加载它们,调整它们的大小并保存到文件系统。 首先我遇到了问题,那个请求只是实现流接口,但我不能像这样直接在管道中使用它:await pipeline(request, imgstream, writableStream) - 通过将请求与管道结合解决了这个问题。
代码如下:
async function processImage(url) {
try {
const pipeline = util.promisify(stream.pipeline);
const resizeTransform = sharp()
.resize(160, 105);
const imgstream = request(url).pipe(resizeTransform);
const localFile = getLocalUrl(url);
const writableStream = fs.createWriteStream(localFile);
await pipeline(imgstream, writableStream);
} catch (err) {
console.log(err);
}
}
urlArr.forEach(processImage);
如果我 运行 这有 100 张图像,它可以很好地处理 30...50 张图像,但其余图像的文件大小为 0 字节,控制台打印如下: 错误:读取 ECONNRESET 在 TCP.onStreamRead (internal/stream_base_commons.js:162:27)
我目前使用的是 win 10 计算机。 代码可能有什么问题?
实际上你的代码是错误的。您正在调用 urlArr.forEach(processImage);
,因为 processImage
是一个 异步 函数,forEach
的默认实现不会 await
作为范围。你需要这样的东西来 await
函数:
for(let i=0; i< urlArr.length; i++){
await processImage(urlArr[i]);
}