2017-07-13 12 views
3

2年前から、jquery html関数をロードしたDOM要素の中には、関数呼び出しの直後にアクセスできない部分的な問題がありました(この動作は、ドキュメント準備完了イベントを待たずに関数を実行するようなものでした)。 .html()を同期すると仮定されていても、このSO answerは(ともこのonehtml機能の約束を使用することを提案:JQueryオブジェクトの約束の目的は何ですか?

$('#divId').html("<h1>hello</h1>").promise().done(function(){ 
    //Callback 
}); 

約束は、このような文脈で意味を作ることができるが、何この約束について私に陰謀は、ということですそれはまた、すべてのjQueryのオブジェクトに返されます。

$('#divId').promise().done(function(){ 
    //Will also be called... 
}); 

私はhtml機能のドキュメントでそれについて何かを見つけることができませんでしたので、私はこの約束の本当の目的は何であったかと思いまして、それが使用されている場合この文脈では正しく

+1

返される約束は、指定されたコレクションの現在のアニメーションがすべて完了したときに解決されます。 –

+1

リンクされた答えは単に間違っています。 –

+2

いいえ、リンク先の特定のものだけです.30以上のアップボックスがあります。 –

答えて

6

2つの方法は関連していません。人々がこれを示唆している理由は、競合状態の仕事をしているコードを作るために.promise().done()を使用できることを誰かが知ったからです。それは同じ理由で同じコードをsetTimeout(fn, 0)でラップしてもうまくいきました。ブラウザーがレンダリングを実行した後、または他の非同期コールバックが完了した後に、後で実行されるコールバックキューにプッシュバックされます。

.htmlは同期型で、コールバックを持たず、コールバックは必要ありません。ただし、ブラウザのレンダラは非同期なので、呼び出しスタックがクリアされるまで変更をレンダリングしません。 .promiseを使用すると、コールバックがコールバックキューにプッシュされ、競合状態または非同期ロジックの欠陥を解決するレンダリング後にコードが実行されます。

.promise()がjqueryコレクションで使用されると、現在実行中のすべてのjqueryアニメーションが完了すると解決される約束が返されます。現在実行中のアニメーションがない場合、プロミスは直ちに解決され、コールバックはコールバックキューにプッシュされ、スタックがクリアされると呼び出されます。

これはバンダイです。私はそれを使用しないことをお勧めし、その代わりに非同期ロジックの欠陥を解決して解決策にしています。

関連する問題