如何在 node.js 中的一定时间后强制解决承诺?
How to force resolve a promise after certain duration in node.js?
我正在尝试从他们的 url(s) 下载大量图像,然后在 Node.js 中创建一个 PDF 文件。我正在使用 image-downloader module to download the images in a promise chain and then once all promises are resolved, using another module, images-to-pdf,触发 pdf 的创建。
问题是大多数承诺会在大约 5-6 秒内立即得到解决,但有一些图像需要花费相当多的时间才能下载。我想在一定的等待时间间隔后强制触发 PDF 创建。可以吗?
这是代码
var promises = data.map(function(element){
return download.image(element)
.then( ({filename}) => {
console.log("Saved to ",filename);
return filename;
})
});
Promise.all(promises).then(function (data){
var fileName = url.slice(url.indexOf("files")+7, url.length-1).replace("/","_")+".pdf";
data.forEach(
(element) => {console.log(element);
});
imagesToPdf(data, fileName)
.then(console.log(" PDF creation done."));
})
.catch ((error) => {
console.error(error);
});
传入 data.map
的数据是一个 JSON 具有以下性质的对象 -
[
{
url:"https://path//to//image//001.jpg",
dest:"local//path//to//image//001.jpg"
},
{
url:"https://path//to//image//002.jpg",
dest:"local//path//to//image//002.jpg"
},
{
url:"https://path//to//image//003.jpg",
dest:"local//path//to//image//003.jpg"
},
...
}]
你可以使用 Promise.race()
为每个图像承诺添加超时,如果你要解决它,那么你需要用一些标记值来解决它(我在这里使用 null
在此示例中),您可以对其进行测试,以便您知道在处理结果时跳过它。
function timeout(t, element) {
return new Promise(resolve => {
// resolve this promise with null
setTimeout(resolve, t, element);
});
}
var promises = data.map(function(element) {
const maxTimeToWait = 6000;
return Promise.race([download.image(element).then(({ filename }) => {
console.log("Saved to ", filename);
return filename;
}), timeout(maxTimeToWait)]);
});
然后,在处理 Promise.all()
结果的代码中,您需要检查 null
并跳过那些,因为那些是超时的。
我正在尝试从他们的 url(s) 下载大量图像,然后在 Node.js 中创建一个 PDF 文件。我正在使用 image-downloader module to download the images in a promise chain and then once all promises are resolved, using another module, images-to-pdf,触发 pdf 的创建。
问题是大多数承诺会在大约 5-6 秒内立即得到解决,但有一些图像需要花费相当多的时间才能下载。我想在一定的等待时间间隔后强制触发 PDF 创建。可以吗?
这是代码
var promises = data.map(function(element){
return download.image(element)
.then( ({filename}) => {
console.log("Saved to ",filename);
return filename;
})
});
Promise.all(promises).then(function (data){
var fileName = url.slice(url.indexOf("files")+7, url.length-1).replace("/","_")+".pdf";
data.forEach(
(element) => {console.log(element);
});
imagesToPdf(data, fileName)
.then(console.log(" PDF creation done."));
})
.catch ((error) => {
console.error(error);
});
传入 data.map
的数据是一个 JSON 具有以下性质的对象 -
[
{
url:"https://path//to//image//001.jpg",
dest:"local//path//to//image//001.jpg"
},
{
url:"https://path//to//image//002.jpg",
dest:"local//path//to//image//002.jpg"
},
{
url:"https://path//to//image//003.jpg",
dest:"local//path//to//image//003.jpg"
},
...
}]
你可以使用 Promise.race()
为每个图像承诺添加超时,如果你要解决它,那么你需要用一些标记值来解决它(我在这里使用 null
在此示例中),您可以对其进行测试,以便您知道在处理结果时跳过它。
function timeout(t, element) {
return new Promise(resolve => {
// resolve this promise with null
setTimeout(resolve, t, element);
});
}
var promises = data.map(function(element) {
const maxTimeToWait = 6000;
return Promise.race([download.image(element).then(({ filename }) => {
console.log("Saved to ", filename);
return filename;
}), timeout(maxTimeToWait)]);
});
然后,在处理 Promise.all()
结果的代码中,您需要检查 null
并跳过那些,因为那些是超时的。