3 回答

TA貢獻1829條經驗 獲得超13個贊
如果你想使用reduce,那么代替
return arr
嘗試
return [...arr, currentValue]
但是,我認為您最好提供地圖:
let DNSvariable = result.map((currentValue) => {
var setIP = currentValue.dstAddress;
var dns = require('dns');
dns.setServers([
'8.8.8.8',
]);
dns.reverse(setIP, (err, address) => {
currentValue.dstAddress = address;
});
return currentValue;
});
我還建議將這些行移到您的函數之外,因為它們只需要調用一次。
var dns = require('dns');
dns.setServers([
'8.8.8.8',
]);

TA貢獻1963條經驗 獲得超6個贊
Reduce 看起來并不適合您的用例。我建議使用“地圖”方法。例如,
如果有一個數組,
var arr1=[{a:1},{a:3},{a:4}]
您需要另一個包含一些修改記錄的數組:
var arr2=arr1.map((elem)=>{
const elem2={...elem}
elem2.b=5;
return elem2;
})
console.log('Array1:',arr1)
console.log('Array2:',arr2)
結果:
'Array1:' [ { a: 1 }, { a: 3 }, { a: 4 } ]
'Array2:' [ { a: 1, b: 5 }, { a: 3, b: 5 }, { a: 4, b: 5 } ]

TA貢獻1780條經驗 獲得超5個贊
首先,使用新的 Promises api
const { Resolver } = require('dns').promises;
const resolver = new Resolver();
resolver.setServers(['8.8.8.8']);
接下來,像這樣解析所有地址:
async function main() {
const promises = data.map(item => resolver.reverse(item.dstAddress));
const hostNames = await Promise.all(promises);
data.forEach((item, i) => {
item.dstAddress = hostNames[i];
});
console.log(data);
}
main();
首先,我們構造一個包含所有解析 Promise 的數組。接下來我們等待所有 Promise 被解決。最后,我們.dstAddress用每個相應的結果覆蓋。
編輯:
由于Promise.all如果單個 Promise 失敗則失敗,這里有一個包含dns.reverse在自定義 Promise 中的替代版本:
const dns = require('dns');
dns.setServers(['8.8.8.8']);
const reverser = (ipAddress) => new Promise(resolve => {
dns.reverse(ipAddress, (err, hostname) => {
if (err) resolve(ipAddress);
else resolve(hostname);
});
});
如您所見,解析 IP 失敗只會返回 IP;這樣每個 Promise 都會解決,即使它dns.reverse自己失敗了。
像這樣使用:
async function main() {
const promises = data.map(item => reverser(item.dstAddress));
const hostnames = await Promise.all(promises);
data.forEach((item, i) => {
item.dstAddress = hostnames[i];
});
console.log(data);
}
main();
添加回答
舉報