9069


コメントアウトしている箇所は正しく動作するのですが、一番下のDeferredインスタンスを利用する方法だと、処理を待たずにdelayメソッドが同時に実行されてしまします。何故なのでしょうか？

[code]

    delay = (msg)->
      $.Deferred (p)->
        setTimeout ->
          console.log msg
          p.resolve()
        ,1000
    
    #delay('test').done ->
    #  delay('test2').done ->
    #    delay('test3').done ->
    
    #delay('start')
    #.then ->delay(1)
    #.then ->delay(2)
    #.then ->delay(3)
    
    #$.Deferred().resolve()
    #.then ->delay(1)
    #.then ->delay(2)
    #.then ->delay(3)
    
    d = new $.Deferred()
    
    d.then ->delay(1)
    d.then ->delay(2)
    d.then ->delay(3)
    
    d.resolve()
    
[/code]

<http://jsfiddle.net/d9prbjg0/4/>


CC BY-SA 3.0
2015-04-11T22:28:38.823
9059
2015-04-12T05:11:33.420
2015-04-11T22:36:05.150
5840
5840
question
jquery coffeescript
jQuery Deferredでthenが処理を待ってくれない

[code]

    $.Deferred().resolve()
    .then ->delay(1)
    .then ->delay(2)
    .then ->delay(3)
    
[/code]

この例では `then()` が返した Deferred オブジェクトに対して `then()`
を実行していますよね。これをメソッドチェインを使わずに書くなら一度変数に入れる必要があります。

[code]

    d = $.Deferred().resolve()
    d = d.then ->delay(1)
    d = d.then ->delay(2)
    d = d.then ->delay(3)
    
[/code]

それを踏まえて、ご質問のコードを修正してみました。

[code]

    d1 = $.Deferred()
    
    d = d1.then -> delay(1)
    d = d.then -> delay(2)
    d.then -> delay(3)
    
    d1.resolve()
    
[/code]

<http://jsfiddle.net/jrp3kvuq/1/>

[`$.Deferred()`](https://api.jquery.com/jQuery.Deferred/) で新しいインスタンスを返すので new
は不要です。また、 `resolve()` したいのは最初の Deferred オブジェクトですから、 `d1` として別にしてあります。

なお、 then で Deferred オブジェクトを返してしまうと、それを受け取った側が `resolve()` `reject()`
できてしまいます。コールバックの設定だけさせたいなら、代わりに
[`promise()`](https://api.jquery.com/deferred.promise/) で取得した Promise
オブジェクトを返すべきです。

[爆速でわかるjQuery.Deferred超入門 - Yahoo! JAPAN Tech
Blog](http://techblog.yahoo.co.jp/programming/jquery-deferred/)


CC BY-SA 3.0
2015-04-12T05:11:33.420
9069
2015-04-12T05:11:33.420
8000
9059
answer