我在一周前开始使用node.js并阅读了大多数问题,以及文档。我仍然对回调如何正常工作感到困惑,并且无法使这些特定代码生效:
var someDomains = ['domain1.com', 'domain2.com', 'domain3.com'];
var someCnames = new Array();
function getCNAME (hostname, callback) {
dns.resolve(hostname, 'CNAME', function(error, cname) {
if (cname) {
callback(cname)
}
});
}
function saveCNAME(cname) {
// what to do here so that it saves into someCnames??
// when I try someCnames.push(cname) within this function, it..
// .. stores the cname only within this function. Console.log below..
// .. shows up as [].
}
someDomains.forEach(function(a) {
getCNAME(a, saveCNAME);
}
console.log(someCnames); // this should show a list of cnames
基本上,我如何修改saveCNAME中存在于saveCNAME函数之外的someCnames?我找到的所有示例都显示在函数中的console.log(某些东西),但是我需要在saveCNAME函数之外处理someCnames。
答案 0 :(得分:2)
跟踪已执行的回调次数:
var someDomains = ['domain1.com', 'domain2.com', 'domain3.com'];
var someCnames = new Array();
var total = someDomains.length;
function getCNAME (hostname, callback) {
dns.resolve(hostname, 'CNAME', function(error, cname) {
if (cname) {
callback(cname)
}
});
}
function saveCNAME(cname) {
someCnames.push(cname);
total--;
if (total === -1) {
console.log(someCnames);
}
}
someDomains.forEach(function(a) {
getCNAME(a, saveCNAME);
}
(或者,您可以使用an async control flow library)
答案 1 :(得分:1)
您应该将该console.log放在saveCNAME函数中。您很可能已经保存了这些CNAMES,但是在完成对getCNAME和saveCNAME的其他调用之前,正在调用console.log。