【问题标题】:node kriskowal/q promise stack errors on chaining promises节点 kriskowal/q 承诺堆栈错误链接承诺
【发布时间】:2013-05-28 23:14:26
【问题描述】:

第一个 .then 出现以下代码错误:

/Users/danielbyrne/working/mite_npm/mite.js:48
      .then(configMan.validateSettings(parsedData))
ReferenceError: parsedData is not defined

我不明白为什么这段代码会失败。 来电:

parseConfigurationFile(path.join(__dirname,'file.config'))
        .then(validateSettings(parsedData));

它调用的函数:

function parseConfigurationFile(fileName) {
    var readFile = q.nfbind(fs.readFile);   

    readFile(fileName,"utf-8")
    .then(function(data) {      
        var deferred = q.defer();        
        // Return the Config 'settings' in JSON
        deferred.resolve(JSON.parse(data));
        return deferred.promise;    
    });         
}

function vaidateSettings (data) {...}

唯一可行的方法是,如果我将函数 validateSettings 更改为匿名函数并将其像这样内联:

parseConfigurationFile(path.join(__dirname,'file.config'))
        .then(function(parsedData){...});

为什么我不能以这种方式链接命名函数?

【问题讨论】:

  • 你有完整的堆栈跟踪吗?这绝对是 data 是您代码中某处的变量,我的,或者可能是其他人的变量,但在该范围内不存在。我检查了 Q 并且该库中没有对 data 的引用。
  • 我很抱歉。引用的“parsedData”位于示例的第 2 行。
  • 我尝试了几种不同的方式重构这段代码。基本上第二个 .then 总是抛出这个错误,除非它是一个匿名函数。我确定这只是因为我不知道自己在做什么。
  • 从 parseConfigurationFile() 返回的值对第二个函数调用 validateSettings() 不可用,除非我将其设为匿名函数。这是为什么呢?

标签: node.js q


【解决方案1】:

您的 validateSettings 调用应该是这样的:

parseConfigurationFile(path.join(__dirname,'file.config'))
    .then(validateSettings);

原因是 validateSettings 需要作为函数引用,而 .then 将使用正确的参数调用该函数。以您的方式执行此操作,您会收到一个引用错误,因为 parsedData 在绑定函数调用时不可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-15
    • 2017-05-08
    • 2014-03-23
    • 2015-07-03
    • 2015-02-04
    • 1970-01-01
    • 2015-05-12
    相关资源
    最近更新 更多