javascript - 如何在 node.js 中的一定持续时间后强制解决 promise ?

标签 javascript node.js promise request timeout

<分区>

我正在尝试从他们的 url 下载大量图像,然后在 Node.js 中创建一个 PDF 文件。我正在使用 image-downloader模块下载 promise 链中的图像,然后一旦所有 promise 都得到解决,使用另一个模块,images-to-pdf , 以触发 pdf 的创建。
问题是大多数 promise 会在大约 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() 为每个图像 promise 添加超时,如果您要解决它,那么您需要使用一些标记值来解决它(我使用 null here in this example),您可以对其进行测试,以便您知道在处理结果时跳过它。

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 并跳过那些,因为那些是超时的.

关于javascript - 如何在 node.js 中的一定持续时间后强制解决 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65463307/

相关文章:

javascript - 在 Ajax 中使用数组

javascript - Bootstrap Collapse 在点击关闭时会有轻微的延迟

node.js - 事件驱动服务器/应用程序的免费 PaaS 有哪些限制?

node.js - NodeJS : understanding promise

node.js - Mongoose 从 `group` 之后的嵌套模式获取属性

javascript - 使用 promises 实现简单的请求链逻辑

javascript - JavaScript 中的 WebRTC

javascript - 替换数组中文本的简写

javascript - ReactJS - .map 函数内的 REST API 查询?

C++ 返回一个 future