1

以下に示すコードは、現在の形式でエラーなくコンパイルおよび実行されますが、19 行目の「getNextAsyncTasks」の型宣言がコメント解除されるとすぐに、コンパイラは次のエラーでクラッシュします。

  1. 内部エラー: プロパティ 'publicMembers' の値を取得できません: オブジェクトが null または未定義です
  2. 内部エラー: IntelliSense 機能が無効になっています。ソース ファイルを編集して、有効なコンパイル状態を復元してみてください。
  3. プロパティ 'publicMembers' の値を取得できません: オブジェクトが null または未定義です
  4. コマンド ""C:\Program Files (x86)\Microsoft SDKs\TypeScript\0.8.0.0\tsc" ... " はコード 1 で終了しました。

この特定のケースでそれを回避する方法はわかっていますが、コード ベースの他の領域で作業していると、エラーは黙って発生し続けます。それが起こったことに気付くまでに、私はかなりの量の変更を加えていることが多く、今回の問題がどこから来ているのかについてのヒントがないため、デバッグするのは非常に難しい場合があります.

理想的には、誰かがこのクラッシュの原因を教えてくれれば、それを回避/回避する方法をよりよく理解できると思います.

module abstract {
    export interface ICallback {
        (...args: any[]): any;
    }
    export interface IAsyncOp {
        (callback: ICallback): any;
    }
}

export class Chain {
    task : abstract.IAsyncOp;

    constructor(...tasks : abstract.IAsyncOp[]) {
        if (tasks.length === 1)     this.task = tasks[0];
        else if (tasks.length > 1)  this.task = cb => this.sync(() => cb.apply(null, arguments), tasks);
        else                        this.task = cb => cb();
    }

    next(getNextAsyncTasks /*: (...args: any[]) => abstract.IAsyncOp*/) {
        return new Chain(
            (cb: abstract.ICallback) =>
                this.task(
                    () => getNextAsyncTasks.apply(null, arguments)(cb);
                )
        );
    }

    last(cb : abstract.ICallback) {
        this.task(cb);
    }

    sync(cb: (...resultArgs: IArguments[]) => void, tasks: abstract.IAsyncOp[]) {
        var resultArgs : IArguments[] = [], done = 0;

        var getCb = (i) => {
            return () => {
                resultArgs[i] = arguments;
                done++;

                if (done === tasks.length) cb.apply(null, resultArgs);
            }
        };

        for (var i = 0, op; op = tasks[i]; i++) op(getCb(i));
    }
}

// use example
new Chain( cb => setTimeout(() => cb("foo"), 60)
         , cb => setTimeout(() => cb("bar"), 10)
         ).next((op1, op2) => { console.log(op1, op2)
                              ; return cb => setTimeout(() => cb(op1[0], op2[0]), 120)
                              }
         ).next((foo, bar) => { console.log(foo, bar)
                              ; return cb => setTimeout(() => cb(foo, bar, "baz"), 30)
                              }
         ).last((foo, bar, baz) => console.log(foo, bar, baz));

編集: 'next' を更新して、param の型シグネチャが常に正しくなるようにしました。

4

1 に答える 1

1

これはコンパイラのバグのようで、ここにレポートを提出します。私はそれを回避するためにいくつかのことを試みましたが、どれもうまくいきませんでした。例で使用しようとするまでクラッシュは実際には現れないので、興味深いです。

于 2012-10-19T03:16:33.183 に答える