Node.js - 如何在函数之间传递参数

时间:2014-04-11 23:46:51

标签: javascript node.js function asynchronous

我在一周前开始使用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。

2 个答案:

答案 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。

相关问题