2017-05-12 6 views
2

私は何年もJasmineを使用していましたが、現在はのコンセプトを使用して実装できるコードを書いています。オプション async params。私はソースを掘り下げようとしましたが、どのようにしてdone()が動作するのか分かりません。私はこのコードを持っているといいますか:Jasmineの `done()`はどのように実装されていますか?

new Validator({ 
    element: someElement, 
    validator: function (value, done) { 
     doSomeStuffAsyncThenCall(done) 
    } 
}); 

どのように機能しますか?私が壁に当っている部分は、その関数の引数を取得しています。私はthis.options.validatorとバリデーターを得ることができますが、doneが定義されている場合はどうすればと呼びますか?

+0

@zerkmsあなたは精巧にできますか? –

+1

"私が壁に当っている部分がその機能の議論を得ている"。あなたは実際に何をしたいですか? 'length'を使って関数のアーリーシティを取得し、それを使用することができます.2番目の引数があると常に非同期動作を示していると仮定します。 'toString'を使って、文字列化された関数から必要な値を解析することもできます。 –

+0

@zerkms私は私の質問に述べました。「私はそのソースを掘り下げようとしました...」例えば、これは、長すぎる 'Function.prototype.apply.apply'という非同期呼び出しをキャッチする方法です。それは疑似コードがたくさんあり、どのように動作するのか分かりません。これは、 'done()'のためのテストが添付されたファイルです。https://github.com/jasmine/jasmine/blob/master/src/core/QueueRunner.js –

答えて

1

私はあなたの質問を次のように理解しています。関数に2番目の引数があるかどうかを検出したい場合は、それ以外の処理を行います。したがって、あなたは関数Yを渡すことができる関数Xを持っています。もしYが2つの引数を持つならば、関数Zを使って非同期的にYを呼び出して2番目のパラメータとして呼び出し、Zが呼び出されるのを待ちます。戻り、次に続行します。

関数Yが与えられた場合、引数の数はFunction.lengthを使用して決定できます。これは、次のように異なるコードパスを持つために使用できます。

function X(Y) { 
 
    if (typeof(Y) !== 'function') { 
 
    throw new Error('argument should be a function'); 
 
    } 
 
    if (Y.length === 2) { 
 
    // asynchronously call Y 
 
    setTimeout(function() { 
 
     Y('foo', function() { 
 
     console.log('Y is done now (1)!'); 
 
     }); 
 
    }, 10); 
 
    } else { 
 
    Y('bar'); 
 
    console.log('Y is done now (2)!'); 
 
    } 
 
} 
 

 
X(function(arg, done) { console.log('Y(' + arg + ')'); done(); }); 
 
X(function(arg) { console.log('Y(' + arg + ')'); });

helping meためJames Allardiceのおかげでこの答えと理解OPの質問を向上させます。

+0

私は問題はOPがそうではないと思います。関数自体を制御して、パラメータの型をチェックすることはできません。彼らのコードの消費者は関数を記述し、OPは消費者が2つの引数を持つ関数を提供しているかどうかを知る必要があります。 –

+0

@JamesAllardiceああ、私は今質問がそのように読むことができることがわかりました。したがって、OPは、 'Function'が2番目のパラメータで何かを行うのかどうかを知りたいでしょうか?それは不可能なように聞こえる...私は私の答えを保つだろう、OPがこれについてコメントしているかどうかを参照してください。 –

+0

いいえ、私は彼らはそれが何かをするかどうかではなく、2番目のパラメータがあるかどうかを知る必要があると思います。これはJasmineのようなツールです。テストとして関数を書く場合、その関数に2番目のパラメータを追加すると、Jasmineはテストを非同期に扱い、2番目のパラメータ(コールバック関数)を呼び出してから移動しますあなたの次のテスト。 –

関連する問題