javascript - 如何在 node.js 中的特定持续时间后强制解决承诺?
问题描述
我正在尝试从他们的 url 下载大量图像,然后在 Node.js 中创建一个 PDF 文件。我正在使用image-downloader模块下载承诺链中的图像,然后在解决所有承诺后,使用另一个模块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
并跳过那些,因为那些是超时的。
推荐阅读
- python - Python,model <> model,如何避免循环导入
- javascript - 更改标签浏览器中显示的徽标在 vuejs 3 中不起作用
- ruby-on-rails - rvm install 2.6.2 在 ubuntu 20.04 中不起作用
- javascript - 对象作为 React 子对象无效(找到:带有键 {...} 的对象)。如果您打算渲染一组孩子,请使用数组
- node.js - ERR_REQUIRE_ESM - TypeScript + nodemon + ts-node + node-fetch
- swift - 无论如何在屏幕关闭时在 AVPlayer 的 audio_manager Flutter 包中显示歌曲的歌手?
- apache-kafka - Kafka Steams 是否有一种方法来计算内部时间窗口中包含的事件数量?
- javascript - 如何通过单击堆栈屏幕标题按钮在屏幕上显示平面列表结果?
- bluetooth-lowenergy - 即使禁用通知也会发送到 bTool
- python - 只有整数、切片 (`:`)、省略号 (`...`)、tf.newaxis (`None`) 和标量 tf.int32/tf.int64 张量是有效索引,得到数组([ 219, 928,