2011-04-06 1 views
10

私は2つのjavascript機能、save()saveAll()、以下のように設定している:上昇jQueryのdeferred.then()

function save(data) { 
    return $.post('/save', data); 
} 

function saveAll(callback) { 
    var dataArray = []; 
    $.each(dataArray, function() { 
     save(this); 
    }); 
    callback(); 
} 

私はそれを活用することをsaveAll()を変更するに興味をjqueryはオブジェクトを継承し、save()操作がすべて完了すると、callback関数が呼び出されます。しかし、私は正確な構文がわかりません。具体的には、$ .when()の中の$ .each()との関係でです。このようなものでしょうか?

function saveAll(callback) { 
    var dataArray = []; 
    $.when(
     $.each(dataArray, function() { 
      return save(this); 
     }) 
    ).then(callback); 
} 

答えて

21

Eliが指摘しているように、$ .when()はコンマで区切られた引数のリストを受け取り、配列ではありません。配列を渡すためにFunction.apply()を使用すると、そのトリックを行うようです。

function saveAll(callback) { 
    var dataArray = [], deferreds = []; 
    $.each(dataArray, function() { 
     deferreds.push(save()); 
    }); 

    $.when.apply(window, deferreds).then(callback); 
} 
+2

これは幻想的で、ちょうどこれを探していました。 jQueryは遅延オブジェクトの配列をネイティブに許可していないことに驚いています。 –

+10

残っていることを待たずに、引数のいずれかが拒否/失敗した場合に直ちに解決されるということが少し分かっているので、注意してください。それは本当です:)あなたが私に尋ねると、予期しない。成功/失敗のステータスに関係なく、常に解決するすべての引数を待つ$ .whenAll()を書きました:http://jsfiddle.net/InfinitiesLoop/yQsYK/ – InfinitiesLoop

1

あなたは彼らがすべて解決した後に実行されます$.when.thenに延期するオブジェクトのコンマ区切りのリストを渡すことができるはずです。

http://api.jquery.com/jQuery.when/

1

私が考える問題は、あなたが$.whenに供給するようにしたいよう$.eachは、DeferredオブジェクトのリストをごdataArrayを返していないことです。

+0

あなたが正しいです、$ .each()の戻り値は私が望むものではありません。ありがとう。 –

関連する問題