Javascript 限制等待dns反向函数js的执行时间
我有一个函数a,它执行dns.reverse(ip)(使用'dns'js npm)来检查是否使用了ip。如果它抛出一个错误,它是免费的。大多数IP都能正常工作,因为它会立即抛出错误,但问题是有些IP不会,它会等待1.2分钟超时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){ //
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)代码>太好了,再次感谢您的帮助和解释。被接受为答案。