【问题标题】:Node.js - how to pass params between functionsNode.js - 如何在函数之间传递参数
【发布时间】:2014-04-11 23:46:51
【问题描述】:

我一周前开始使用 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 函数之外的 someCname?我发现的所有示例都在函数中以 console.log(something) 停止,但我需要在 saveCNAME 函数之外处理 someCnames。

【问题讨论】:

  • 为简洁起见,我省略了要求部分。在 getCNAME 中获取 cname 并将其传递给 saveCNAME 也被确认可以正常工作。
  • 为什么要在函数外处理?在saveCNAME 中执行另一个函数调用,或者那里的所有逻辑都执行吗?
  • saveCNAME 一次占用一个域。我想收集所有域和 cnames,然后批量调用数据库以一次存储它们。

标签: javascript node.js function asynchronous


【解决方案1】:

跟踪执行了多少回调:

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

【讨论】:

    【解决方案2】:

    您应该将该 console.log 放在您的 saveCNAME 函数中。您很可能一直在保存这些 CNAME,但在其他对 getCNAME 和 saveCNAME 的调用完成之前调用了您的 console.log。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多