【问题标题】:Promise hangs even though it is resolved即使已解决,Promise 仍会挂起
【发布时间】:2017-08-25 07:27:49
【问题描述】:

我正在使用request-promise 模块来检查站点是否正在使用代理。我正在尝试找到足够快以在 5 秒内回答的代理。因此,如果请求在 5 秒内没有超时,我只会添加对象。

对于某些代理,即使 promise 解析,节点脚本也会挂起一段时间。我找不到这个延迟的原因。我看到它打印 Done 但它挂起。 1 分 10 秒后,脚本退出。这是由于我的代码或开放套接字的操作系统问题等导致的挂起吗?

const rp =  require('request-promise');
const testProxies = [
    {
       "ipAddress": "80.241.219.83",
       "port": 3128,
    },
    {
        "ipAddress": "45.55.27.246",
        "port": 80
    },
    {
        "ipAddress": "144.217.197.71",
        "port": 8080,
    },
    {
        "ipAddress": "104.131.168.255",
        "port": 80,
    },
    ];

function CheckSites(sitesArray,site) {
    let ps = [];
    for (let i = 0; i < sitesArray.length; i++) {
        let proxy = sitesArray[i];

        let ops = {
            method: 'GET',
            resolveWithFullResponse: true,
            proxy: 'http://' + proxy.ipAddress + ':' + proxy.port,
            uri:site,
        };
        let resp =  rp.get(ops);
        ps.push(resp);
    }
    return Promise.all(ps.map(function (p) {
        p.time =  Date.now();
        return p
            .then(function (a) {
                return {'header':a.headers,'time':Date.now() - p.time};
            })
            .timeout(5000)
            .catch(function (e) {
                return {};
            })
    }))
}
CheckSites(testProxies,'https://www.example.com').then(function (object) {
    console.log('Done!');
    console.log(object);
}).catch(function (err) {
    console.log('Exception: ' + err);
});

【问题讨论】:

    标签: javascript node.js requestjs


    【解决方案1】:

    对于您的用例,我建议您使用Promise.race(),它的行为与Promise.all 相同,但您会在最快的代理响应后立即收到回调。

    我对这个bug进行了更多调查,它似乎是a request module issue,当你使用超时时,他们只是不关闭连接,它处于挂断状态

    【讨论】:

    • 我在控制台上收到Done! 。这意味着所有的承诺都已解决。即使使用Promise.race(),它仍然会挂起一段时间然后脚本退出
    • @Meanteacher 我更新了我的答案似乎是请求模块错误,超时github.com/request/request/issues/1676 他们没有关闭连接。
    • 我检查了您链接到另一个问题的链接。但是,该用户说这是他的代码错误。我仍然无法理解原因。还是谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2020-03-31
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多