2012-03-23 10 views
2

私はDeferredオブジェクトの配列を持っています。これは、完了したら解決された値にマップしようとしています。すべてが解決したら配列を返したいDeferredsの配列から値を抽出する

は、ここで私がこれまで持っているものです。

$.when.apply(null, deferredArray) 
.pipe(function(){ 
    return deferredArray; 
}); 

は残念ながら、これは解決された状態の繰延オブジェクトの配列を返します。 解決された要素に直接アクセスする方法はありますか?私は.then.pipeをDeferredオブジェクトの解決された配列に個別に連結できますが、これは私の目的のためにうまく機能しません。ここで

答えて

2

遅延オブジェクトは、戻り値に設計されていません。結果をコールバックで処理する必要があります。結果はdonefailまたはpipeコールバックの引数として渡され

:カウスの

$.when.apply(null, deferredArray).then(function(){ 
    // arguments[0] is the result of the first deferred object 
    // arguments[1] is the result of the second deferred object 
    // ... 

    // or simple pass it to a function that needs the results: 
    someFunction(arguments); 
}); 

あなたにもちょうどコールバックとしてその機能を設定することができます。

$.when.apply(null, deferredArray).then(someFunction); 

DEMO

+0

私は理解していますが、私が言及したように、これは私の目的のためにはうまくいきません。私は特定の構造(オブジェクトの配列)を渡すことになっているJSライブラリを使用しています。オブジェクトを取得するためにAJAX呼び出しを使用するので、解決された値の配列を渡す必要があります。 –

+0

@ JiaweiLi:あなたの答えに私のコメントで言ったように、あなたが配列を得ることができたとしても、それが処理される瞬間にはまだ値を含んでいないかもしれません。コールバックの中でライブラリ関数を呼び出さなければなりません。私の更新を参照してください。 –

-1

はハックのソリューションです:

extractDeferredArray = function(array) { 
    var deferred, extract, ret; 
    ret = []; 

    extract = (function() { 
    var _i, _len, _results; 
    _results = []; 
    for (_i = 0, _len = array.length; _i < _len; _i++) { 
     deferred = array[_i]; 
     _results.push(deferred.then(function(value) { 
     return ret.push(value); 
     })); 
    } 
    return _results; 
    })(); 

    // Make sure our .then methods have completed 
    return $.when.apply(null, extract).pipe(function() { 
    return ret; 
    }); 
}; 

は一種の厄介なこれを行うには持っているようです。

+0

をCoffeeScriptはここでどのように役立つと思われますか? –

+0

私は一般的にCoffeeScriptを簡単にコーディングすることができます。人々がそれを知らない場合に備えて、私の解決策をJavascriptに変更しました。 –

+0

ああ、私は自分の質問に答えたことに気付かなかった。私はちょうどあなたの質問にCoffeeScriptを言及しなかったので、混乱していた。とにかく、コードが期待どおりに動作しない可能性があります。 'extractDeferredArray'が配列を返す瞬間に、遅延オブジェクトがまだ解決されていない可能性があるため、配列がまだ生成されていない可能性があります。 –

関連する問題