単体テストを行っています。テストフレームワークは、ページをiFrameに読み込み、そのページに対してアサーションを実行します。各テストを開始する前にPromise
、iFrameのonload
イベントを呼び出すようresolve()
に設定し、iFrameを設定しsrc
、promiseを返すを作成します。
したがって、を呼び出すだけloadUrl(url).then(myFunc)
で、ページがロードされるのを待ってから何を実行することもできmyFunc
ます。
この種のパターンは、主にDOMへの変更を許可するために(URLのロードだけでなく)、テストのあちこちで使用されています(たとえば、ボタンのクリックを模倣し、divが非表示になって表示されるのを待ちます)。
この設計の欠点は、数行のコードを含む匿名関数を常に記述していることです。さらに、回避策(QUnit's assert.async()
)がありますが、プロミスを定義するテスト関数は、プロミスが実行される前に完了します。
から値を取得する方法、Promise
または.NETのように解決されるまで待機(ブロック/スリープ)する方法があるかどうか疑問に思っていますIAsyncResult.WaitHandle.WaitOne()
。私はJavaScriptがシングルスレッドであることを知っていますが、それが関数が生成できないことを意味しないことを願っています。
本質的に、正しい順序で結果を吐き出すために以下を取得する方法はありますか?
function kickOff() {
return new Promise(function(resolve, reject) {
$("#output").append("start");
setTimeout(function() {
resolve();
}, 1000);
}).then(function() {
$("#output").append(" middle");
return " end";
});
};
function getResultFrom(promise) {
// todo
return " end";
}
var promise = kickOff();
var result = getResultFrom(promise);
$("#output").append(result);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>
.then(fnAppend.bind(myDiv))
して、匿名を大幅に削減できます。