0

別のモジュール/アプリケーションによるロード時に、公開された関数のいずれかを呼び出す前に、その構成内のものを実行およびロードできるようにする必要がある Node モジュール (ハーモニーを使用) を作成しようとしています。

yield私が抱えている問題は、を使用して実行されている内部関数に見えないことですmodule.exports。例が役立ちます。

module.exports = function*(s_id){
    console.log('loading the module lets it execute up till here');
    if (!(this instanceof Tester)) return yield new Tester();
    }


function* Tester(){
    console.log('but we never execute this generator function');
    }

Tester.prototype = {
    model : function*(){
        // other functions
        }
    }

もう何時間も私を困惑させています!解決策は非常に単純だと思いますが、頭を抱えているようには見えません。Tester() 関数を単純にエクスポートしようとしましたが、まだ同じ問題が発生しています。yieldなぜ私は Tester() 関数に見えないのですか?

また、このアプローチに代わるものは何ですか?上記の例のs_id変数/オブジェクトなど、モジュールをさまざまな入力でロードできるように、モジュールのオブジェクトの性質を維持したいと考えています。

4

1 に答える 1

1

ノードモジュール (ハーモニーを使用) は、別のモジュール/アプリケーションによってロードされたときに、公開された関数を呼び出す前にその構成内のものを実行してロードできるようにする必要があります。

そうしないでください。ジェネレーターは非同期用に作成されていません。yieldここであなたが望むことをしません。モジュールは、その中の何かがロードされるのを待つために「解放」されません。yieldはマジックですが、非同期マジックではありません

非同期のモジュール読み込みプロセスを使用する必要がある場合は、実際のモジュールのpromiseをエクスポートします。これは、何かを待機するための標準インターフェースであり、モジュールの内部に依存しない標準化されたアプローチを使用して使用できます。

その約束を構築するための構文を引き続き使用できyieldます。お気に入りのコルーチン ライブラリを使用するだけです。

return yield new Tester();
…
function* Tester(){…}

ええとああ。はい、どうやらジェネレーター関数をコンストラクターとして呼び出すことは可能です。しかし、私を信じてください、それはあなたが望むものではありません. 任意のオブジェクトのコンストラクターは、イテレーターではなく、そのオブジェクトを返す必要があります ( promise を返してはならないのと同じように)。オブジェクト メソッドの一部がジェネレーター メソッドである場合は問題ありませんが、コンストラクターはそうではありません。

そのようなコードでジェネレーター関数を本当に使用したい場合 (コンストラクターを意図したものではない場合)、

  • ingではなく、yield*作成したイテレータ ( )が必要です。tester()yield
  • .prototypeあなたがしたようにそのプロパティを上書きしてはいけません。イテレータが誤動作する原因となります。(もちろん、ほとんどの場合は機能しますが、決してそれを行うべきではありません)
于 2015-04-25T20:59:03.893 に答える