定义的函数坚持其未定义

时间:2014-09-03 12:15:59

标签: javascript node.js rsvp-promise

我有一个简单的小程序,它将两个函数定义为变量。这些函数都返回RSVP Promises,以便它们可以链接在一起,如下所示。我经常使用这种模式,但在这种情况下,我会陷入疯狂......

var opChown = function() { ... };
var opChgrp = function() { ... };

debug('chown: ' + opChown);
debug('chgrp: ' + opChgrp);
// Chain permission operations          
opChown()
    .then(opChgrp())
    .then(function() {
        debug('resolving parent promise');
        resolve();
    })
    .catch(function(err) {
        debug('rejecting parent promise');
        reject(err);
    }
);

虽然我的调试语句清楚地表明这两个函数实际上是定义的,但当我执行它们时,我得到一个未处理的异常:

  

TypeError:undefined不是函数

请帮助我失去理智。任何和所有建议都欢迎。


对于一些其他上下文,这里是opChown

的定义
var opChown = function() {
    return new RSVP.promise(function(resolve,reject) {
        debug('opChown');
        if(options.ignoreChown) {
            resolve();
        } else {
            var chown = shell('chown',['-R', downgradedUser, destDir]);
            debug('chown command executed; user permission is "%s"', downgradedUser);
            chown.on('exit',function(code) {
                if(code !== 0) {
                    var errMessage = 'Build [' + code + ']:' + ' problems changing ownership on "' + destDir + '" directory to ' + downgradedUser + '.';
                    debug('Problem with chown: %s', code);
                    reject({operation:'chown', message: errMessage});
                } else {
                    console.log(' - %s executed, user permissions changed to %s', chalk.bold('chown'), chalk.bold(downgradedUser));
                    resolve();
                }
            }); // end chown
        }
    });
}; // end opChgOwn          

现在基于@ bergi的伟大指针,我确实可以在Node' uncaughtException'上找到堆栈跟踪。事件,这里是堆栈跟踪,它清楚地指出问题在opChown函数内而不是函数本身:

TypeError: undefined is not a function
    at opChown (/lib/broccoli-watcher.js:117:13)
    at ChildProcess.<anonymous> (/lib/broccoli-watcher.js:167:5)
    at ChildProcess.emit (events.js:98:17)
    at Process.ChildProcess._handle.onexit (child_process.js:809:12)

2 个答案:

答案 0 :(得分:2)

虽然我原本期望错误消息类似于undefined is not a constructor,但它看起来好像是行

    return new RSVP.promise(function(resolve,reject) {

应该是

    return new RSVP.Promise(function(resolve,reject) {
//                  ^

请注意@SLaks也发现了一个错误:then采用了回调函数。你可能想用

opChown().then(opChgrp)…

答案 1 :(得分:1)

.then(opChgrp())

您刚刚立即致电opChgrp 并将其结果传递给then()

由于它没有返回任何内容,因此会出错。