gpt4 book ai didi

javascript - 为什么 promise-limit 在 Nodejs 中不起作用?

转载 作者:行者123 更新时间:2023-12-04 08:15:04 25 4
gpt4 key购买 nike

我有大量的图像要下载。我正在使用 request-promise包以从其 URL 下载图像。由于有大量图片,服务器变得过载,下载会挂起或损坏,所以我决定使用 promise-limit 库来设置并发限制。这是我的代码:


const fs = require('fs');
const request = require('request-promise');
const promiseLimit = require('promise-limit');

var limit = promiseLimit(30);

async function download(data) {
console.log(data);

return Promise.all(data.map( (obj) => {
return limit(() => downloadRequest(obj))
})).then(() => {
console.log("All images downloaded.")
})

function downloadRequest(obj) {
var img = obj.dest;
var url = obj.url;
var req = request(url);
req.pipe(fs.createWriteStream(img));
}
我完全按照 github 页面中给出的方式复制了示例,但是该方法在没有 Promise.all() 的情况下返回。满足。我不明白我做错了什么,我认为 Promise.all() 肯定会等到它解决所有 promise 。
在后端,此调用用作
...
.then((data) => {
return downloader.download(data);
})
.then(() => {
var filename = "Sample.pdf";
// Pages.json is written early in the chain, contains URL and corresponding image paths
return generator.generate('./Pages.json', filename);
});
这是否意味着 NodeJS 已经在尝试从 pages.json 生成文件?如何使这部分代码同步下载?

最佳答案

您的职能 downloadRequest()不返回 promise 。它必须返回一个与包含中的异步操作相关联的 promise ,以便在异步操作完成时解决 promise ,或者在异步操作出现错误时拒绝 promise 。只有当它这样做时limit()包正确地完成它的工作。
由于您正在使用流并将其输送到 downloadRequest() ,您将必须手动构建一个 promise ,然后监视流中的各种事件以了解它何时完成或出现错误,以便您可以解决或拒绝该 promise 。
这是一个如何制作的想法 downloadRequest()正确返回 promise :

function downloadRequest(obj) {
return new Promise((resolve, reject) => {
const img = obj.dest;
const url = obj.url;
const req = request(url);

req.on('error', reject);

const ws = fs.createWriteStream(img);
ws.on('error', reject);
req.pipe(ws).on('finish', resolve);
});
}
而且,现在建议使用 pipeline()函数代替 .pipe()因为它在错误条件下进行了更完整的清理,并且还有一个内置的 promise 版本:
const { pipeline } = require('stream/promises');

function downloadRequest(obj) {
return pipeline(request(obj.url), fs.createWriteStream(obj.dest));
}

附言如果您不知道, request()库已被弃用,建议您不要再在新项目中使用它。有一个可供选择的替代库列表 here ,所有这些也都有内置的 promise 支持。我查看了各种选择,尝试了几种并决定使用 got() 在我的工作中。

关于javascript - 为什么 promise-limit 在 Nodejs 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65747873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com