jQuery API の deferred . promise( target ) は、既に存在するオブジェクトへプロミス動作を添付するのに便利なメソッド。
引数
- target
オブジェクト。
戻り値
- Promise
繰延オブジェクトのメソッドのサブセット。
記述例
var object = {
asyncEvent: function () {
// 処理
}
}
var deferredObject = new jQuery . Deferred();
deferredObject . promise( object );
deferredObject . resolve();
object
. done(
function() {
jQuery( '#sample' ) . text( '成功' );
}
)
. asyncEvent();
asyncEvent: function () {
// 処理
}
}
var deferredObject = new jQuery . Deferred();
deferredObject . promise( object );
deferredObject . resolve();
object
. done(
function() {
jQuery( '#sample' ) . text( '成功' );
}
)
. asyncEvent();
「処理」を実行し、idが「sample」の要素に「成功」と表示する。
実装例(サンプル)
実装例(サンプル)の動作について
セレクトボックスで「解決例」を選択した場合:
「実行」ボタンをクリックすると、オレンジ色のボックス要素の不透明度を25%に変更する、5秒間のアニメーションを、実行する。
アニメーション中、「実行」ボタンの右横に、「進行中」と表示し、「進行中」の右横に、0.5秒ごとに「・」を追加していく。5秒経過すると、「成功」というテキストを追加する。
「実行」ボタンのテキストを「戻す」というテキストに変更する。
「戻す」ボタンを、クリックすると、元に戻す。
セレクトボックスで「リジェクト(拒否)例」を選択した場合:
「実行」ボタンをクリックすると、「実行」ボタンの右横に、「進行中」と表示し、「進行中」の右横に、0.5秒ごとに「・」を追加していく。2秒経過すると、「失敗」というテキストを追加する。
「実行」ボタンのテキストを「戻す」というテキストに変更する。
「戻す」ボタンを、クリックすると、元に戻す。
実装例(サンプル)のソースコード
JavaScript
<script>
<!--
jQuery( function() {
var object = {
asyncEvent: function ( select ) {
if( select == 'resolved' ) {
jQuery( '#jquery-sample-animation' ) . fadeTo( 5000, 0.25 );
}
}
}
jQuery( '#jquery-sample-button' ) . toggle(
function() {
var deferredObject = new jQuery . Deferred();
deferredObject . promise( object );
jQuery( this ) . prop( 'disabled', true );
jQuery( '#jquery-sample select' ) . prop( 'disabled', true );
var select = jQuery( '#jquery-sample select' ) . val();
if( select == 'resolved' ) {
setTimeout( function() {
deferredObject . resolve( '成功' );
jQuery( '#jquery-sample-button' ) . text( '戻す' );
jQuery( '#jquery-sample-button' ) . prop( 'disabled', false );
}, 5000 );
} else {
setTimeout( function() {
deferredObject . reject( '失敗' );
jQuery( '#jquery-sample-button' ) . text( '戻す' );
jQuery( '#jquery-sample-button' ) . prop( 'disabled', false );
}, 2000 );
}
setTimeout( function() {
deferredObject . notify( '進行中' );
if ( deferredObject . state() === "pending" ) {
setTimeout( function progress() {
deferredObject . notify( '・' );
setTimeout( progress, 500 );
}, 500 );
}
}, 1 );
object
. then(
function( status ) {
jQuery( '#jquery-sample-message' ) . append( status );
},
function( status ) {
jQuery( '#jquery-sample-message' ) . append( status );
},
function( status ) {
jQuery( '#jquery-sample-message' ) . append( status );
}
)
. asyncEvent( select );
},
function() {
jQuery( '#jquery-sample-button' ) . prop( 'disabled', true );
jQuery( '#jquery-sample select' ) . prop( 'disabled', false );
jQuery( '#jquery-sample-message' ) . text( '' );
jQuery( '#jquery-sample-animation' ) . fadeTo( 500, 1 );
setTimeout( function() {
jQuery( '#jquery-sample-button' ) . text( '実行' );
jQuery( '#jquery-sample-button' ) . prop( 'disabled', false );
}, 500 );
}
);
} );
// -->
</script>
<!--
jQuery( function() {
var object = {
asyncEvent: function ( select ) {
if( select == 'resolved' ) {
jQuery( '#jquery-sample-animation' ) . fadeTo( 5000, 0.25 );
}
}
}
jQuery( '#jquery-sample-button' ) . toggle(
function() {
var deferredObject = new jQuery . Deferred();
deferredObject . promise( object );
jQuery( this ) . prop( 'disabled', true );
jQuery( '#jquery-sample select' ) . prop( 'disabled', true );
var select = jQuery( '#jquery-sample select' ) . val();
if( select == 'resolved' ) {
setTimeout( function() {
deferredObject . resolve( '成功' );
jQuery( '#jquery-sample-button' ) . text( '戻す' );
jQuery( '#jquery-sample-button' ) . prop( 'disabled', false );
}, 5000 );
} else {
setTimeout( function() {
deferredObject . reject( '失敗' );
jQuery( '#jquery-sample-button' ) . text( '戻す' );
jQuery( '#jquery-sample-button' ) . prop( 'disabled', false );
}, 2000 );
}
setTimeout( function() {
deferredObject . notify( '進行中' );
if ( deferredObject . state() === "pending" ) {
setTimeout( function progress() {
deferredObject . notify( '・' );
setTimeout( progress, 500 );
}, 500 );
}
}, 1 );
object
. then(
function( status ) {
jQuery( '#jquery-sample-message' ) . append( status );
},
function( status ) {
jQuery( '#jquery-sample-message' ) . append( status );
},
function( status ) {
jQuery( '#jquery-sample-message' ) . append( status );
}
)
. asyncEvent( select );
},
function() {
jQuery( '#jquery-sample-button' ) . prop( 'disabled', true );
jQuery( '#jquery-sample select' ) . prop( 'disabled', false );
jQuery( '#jquery-sample-message' ) . text( '' );
jQuery( '#jquery-sample-animation' ) . fadeTo( 500, 1 );
setTimeout( function() {
jQuery( '#jquery-sample-button' ) . text( '実行' );
jQuery( '#jquery-sample-button' ) . prop( 'disabled', false );
}, 500 );
}
);
} );
// -->
</script>
CSS
<style type="text/css">
<!--
#jquery-sample {
margin: 10px;
}
#jquery-sample select {
margin: 0px 10px 0px 0px;
}
#jquery-sample-message {
margin: 0px 0px 0px 10px;
}
#jquery-sample-animation {
margin: 10px;
padding: 10px;
height: 100px;
background-color: orange;
border: 1px solid gray;
border-radius: 10px;
}
-->
</style>
<!--
#jquery-sample {
margin: 10px;
}
#jquery-sample select {
margin: 0px 10px 0px 0px;
}
#jquery-sample-message {
margin: 0px 0px 0px 10px;
}
#jquery-sample-animation {
margin: 10px;
padding: 10px;
height: 100px;
background-color: orange;
border: 1px solid gray;
border-radius: 10px;
}
-->
</style>
HTML
<div id="jquery-sample">
<p>
<select name="deferred-state">
<option value="resolved" selected>解決例</option>
<option value="rejected">リジェクト(拒否)例</option>
</select>
<button id="jquery-sample-button">実行</button>
<span id="jquery-sample-message"></span>
</p>
<div id="jquery-sample-animation"></div>
</div>
<p>
<select name="deferred-state">
<option value="resolved" selected>解決例</option>
<option value="rejected">リジェクト(拒否)例</option>
</select>
<button id="jquery-sample-button">実行</button>
<span id="jquery-sample-message"></span>
</p>
<div id="jquery-sample-animation"></div>
</div>