Javascript 限制等待dns反向函数js的执行时间

Javascript 限制等待dns反向函数js的执行时间,javascript,reverse-dns,Javascript,Reverse Dns,我有一个函数a,它执行dns.reverse(ip)(使用'dns'js npm)来检查是否使用了ip。如果它抛出一个错误,它是免费的。大多数IP都能正常工作,因为它会立即抛出错误,但问题是有些IP不会,它会等待1.2分钟超时 var dns = require('dns') async function A(ip){ try{ var host = await dns.reverse(ip) if (host.length >1) //its used }catch(e){ //

我有一个函数a,它执行dns.reverse(ip)(使用'dns'js npm)来检查是否使用了ip。如果它抛出一个错误,它是免费的。大多数IP都能正常工作,因为它会立即抛出错误,但问题是有些IP不会,它会等待1.2分钟超时

var dns = require('dns')
async function A(ip){
try{
 var host = await dns.reverse(ip)
 if (host.length >1) //its used
}catch(e){
 // free ip if dns.reverse failed
}
}
我有没有办法将等待dns.reverse(ip)的执行时间限制为5秒,这样它就不会等待整个1.20分钟,如果查找时间超过5秒,就会抛出一个错误? 谢谢

您可以这样使用:

const dns = require('dns');

const timeout = (delay, message) => new Promise((_, reject) => setTimeout(reject, delay, message));

const delay = 5000;

async function A(ip) {
    try {
        const host = await Promise.race([dns.reverse(ip), timeout(delay, `DNS resolution timed out after ${delay} ms`)]);
        console.log(host);
    } catch (e) {
        console.error(e);
    }
}
您可以这样使用:

const dns = require('dns');

const timeout = (delay, message) => new Promise((_, reject) => setTimeout(reject, delay, message));

const delay = 5000;

async function A(ip) {
    try {
        const host = await Promise.race([dns.reverse(ip), timeout(delay, `DNS resolution timed out after ${delay} ms`)]);
        console.log(host);
    } catch (e) {
        console.error(e);
    }
}
只是为了好玩:)可取消版本(中止相关网络请求)

输出:

Host: bud02s23-in-f206.1e100.net,bud02s23-in-f14.1e100.net
Fail: CanceledError: canceled
Fail: CanceledError: timeout

Process finished with exit code 0
只是为了好玩:)可取消版本(中止相关网络请求)

输出:

Host: bud02s23-in-f206.1e100.net,bud02s23-in-f14.1e100.net
Fail: CanceledError: canceled
Fail: CanceledError: timeout

Process finished with exit code 0

谢谢,我想现在可以了。只是个问题。因为承诺前面有wait,所以没有必要在dns.reverse前面有wait,它仍然在为dns.reverse“等待”那5秒钟?这是正确的吗?
dns.reverse(ip)
timeout(…)
都返回承诺,并且
承诺。race
将这两个承诺“连接”为一,我们等待这一承诺。这假设在
A
函数中有更多的逻辑。如果没有,您可以删除
async
关键字并编写以下正文:
return Promise.race([…,…])。然后(console.log)。catch(console.error)太好了,再次感谢您的帮助和解释。被接受为答案。谢谢你,我想现在可以了。只是个问题。因为承诺前面有wait,所以没有必要在dns.reverse前面有wait,它仍然在为dns.reverse“等待”那5秒钟?这是正确的吗?
dns.reverse(ip)
timeout(…)
都返回承诺,并且
承诺。race
将这两个承诺“连接”为一,我们等待这一承诺。这假设在
A
函数中有更多的逻辑。如果没有,您可以删除
async
关键字并编写以下正文:
return Promise.race([…,…])。然后(console.log)。catch(console.error)太好了,再次感谢您的帮助和解释。被接受为答案。