0

2 つの関数を変数として定義する単純な小さなプログラムがあります。これらの関数はどちらも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);
    }
);

私のデバッグ ステートメントは、2 つの関数が実際に定義されていることを明確に示していますが、それらを実行すると、未処理の例外が発生します。

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          

ノードの「uncaughtException」イベントでスタックトレースが実際に利用可能であるという@bergiの優れたポインターに基づいて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)
4

2 に答える 2

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)…
于 2014-09-03T13:08:17.357 に答える