【发布时间】:2021-01-16 08:42:27
【问题描述】:
我有大量图像要下载。我正在使用 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() 肯定会等到它解决所有承诺。
在后端,这个调用被用作
...
.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 生成文件?如何让这部分代码同步下载?
【问题讨论】:
-
@DmitriyFrolov - OP 的问题在别处。如果他们的异步操作正确使用了 Promise,他们正在使用的
limit()包可以正常工作。
标签: javascript node.js concurrency promise limit