JS新手,找到了一些示例代码并对其进行了修改以适应我的目的[1]。它工作正常,但是 *dns.reverse(IP, (err( * 与我的代码完全无关。基本上,我根本不需要dns模块。我尝试以几种方式删除它,但没有奏效。每次代码崩溃时。 想法,如何删除这些不必要的部分?
提前非常感谢,
[1]
const dns = require('dns');
const cache = {};
const crypto = require('./fpe');
const cipher = crypto({});
function reverse(IP) {
if (!cache[IP]) {
cache[IP] = {
promise: new Promise((resolve, reject) => {
dns.reverse(IP, (err) => {
if (!err) {
const value = cipher.encrypt(IP); // cipher.encrypt(IP) give back another IP of format xxx.xxx.xx.xx
cache[IP].value = value;
resolve(value);
} else {
resolve([]);
}
}); //dns.reverse
}), //promise
}; //cache[ip]
return cache[IP].promise;
} else if (!cache[IP].value) {
return cache[IP].promise;
}
return Promise.resolve(cache[IP].value);
}
IP = "172.217.17.68"
let temp = reverse(IP)
temp.then(value => console.log(value))
您可以像这样删除 DNS 调用:
function reverse(IP) {
if (!cache[IP]) {
cache[IP] = {
promise: new Promise((resolve, reject) => {
const value = cipher.encrypt(IP);
cache[IP].value = value;
resolve(value)
})
}
return cache[IP].promise
} else if (!cache[IP].value) {
return cache[IP].promise
}
return Promise.resolve(cache[IP].value)
}
但是,这将导致错误:无法在行cache[IP].value = value;
上设置未定义的属性值。发生这种情况是因为在创建承诺时,在将值分配给cache
之前,将立即调用承诺中的回调。因此,缓存条目实际上还没有时间创建。
不过,这是一个简单的解决方法 - 由于您的代码现在是同步的,因此实际上不需要 Promise。我们可以删除整个 Promise,只需将值应用于缓存。
function reverse(IP) {
if (!cache[IP]) {
const value = cipher.encrypt(IP);
cache[IP] = { value: value };
}
return cache[IP].value
}
请注意,此函数不再返回 Promise,因此,请使用以下命令:
IP = "172.217.17.68"
let value = reverse(IP)
console.log(value)