如何为 Promise 解决添加延迟?向节点 http.request promise 添加延迟

How to add delay to a Promise resolve? Add delay to node http.request promise

尝试为 NodeJS 中的每个 http.request 添加一个小延迟,但当然节点总是进入同步模式。所以问题是如何在承诺履行后重置承诺的状态?

  1. 目前helper.delay()只工作一次开始然后所有的http请求都立即发送,导致服务器出错。
  2. 为什么我不能在 我的 module.exports 中对其他承诺使用 this.delay()?但它在正常的可导出函数中工作正常。
  3. 题外话。如何根据请求的 URL 将 http 切换为 https? (不复制相同的代码,消除冗余)。

尝试在承诺中设置默认超时,用新的 setTimeout 承诺包装 http.request,尝试使用外部 "requestHandler" 作为回调,这是 运行 函数作为 thennable。 etc.etc 也许我必须 clearTimeout? https://nodejs.org/api/timers.html

出口

const wait = require("util").promisify(setTimeout);
module.exports = {
    delay: async function(seconds){
        await wait(seconds * 1000);
    },
    getUrl: function(url){
        return new Promise((resolve, reject) => {
            const options = new URL(url);
            const resolver = http.request(options, res => {
                res.setEncoding("utf8");
                let responseBody = '';
                res.on("data", body => {
                    responseBody += body
                });
                res.on('end', () => resolve(responseBody));                
            });
            resolver.end();
        });
    }
};

应用程序

const helper = require("./exports.js");
async function getdata(url) {
    const data = await help.getUrl(url);
    let results = JSON.parse(data);
    results = results.answer;
    return results;
}
function fetchData(el, i) {
    getdata(el).then(
        answer => { console.log(answer)},
        //...etc
        )
}
function getLinksFromFile(file) {
    helper.readFile(file)
        .then(arr => {
            arr.forEach((el, i) => {
            /////////ISSUE HERE BELOW//////////////
                helper.delay(4).then(() => {
                ////It only waits once
                    return fetchData(el, i);
                });
            });
        });
}
getLinksFromFile("./links.txt");

objective 非常简单,读取 url 的表单文件,从 url 获取 json 数据并执行操作。 无依赖性

您需要阅读更多有关 Promise 工作原理的文章或对 Promises 进行更多实验,以更好地理解它们。

那么这段代码是做什么的:

 arr.forEach((el, i) => {
            /////////ISSUE HERE BELOW//////////////
                helper.delay(4).then(() => {
                ////It only waits once
                    return fetchData(el, i);
                });
            });

您遍历 arr 的每个元素,并使用 helper.delay(4) 为每个元素创建延迟的 Promise。但是所有这些 Promise 都是在大致相同的时间创建的(相隔仅几纳秒),因为 forEach 不会等待一个 Promise 链完成。所以每个 fetchDataforEach 发生的时间延迟 4 秒。

解决该问题的最简单方法是将代码转换为使用 await/async 语法:

async function getLinksFromFile(file) {
    let arr = await helper.readFile(file);
    for( let i=0, i<arr.length ; i++) {
        let el = arr[i];
        await helper.delay(4)
        await fetchData(el, i)
    }
}

在常规循环中使用 await 将在该点暂停循环,直到解决 Promise。