2016-10-04 19 views
0

多くのjson呼び出しを実行し、結果にコールバックを適用する必要があります。呼び出しの回数は実行時まで不明です。したがって、$.when.applyを使用して、約束の配列をwhenに渡します。

jsonPromises  = [] 
    newContentActions = [] 
    for model in models 
     jsonPromises.push contentCreator.create(model) 
     action = new ActionHandler model 
     newContentActions.push action 

    $.when.apply($, jsonPromises) 
    .then (args...) => 
    _.each args, (result, idx) => 
     return unless result[1] is 'success' 
     action = newContentActions[idx] 
     action result[0] 

これは多かれ少なかれ動作します。 1つ以上の約束がある場合、$.whenのハンドブックは、配列の配列を取得します(例えば、Chrome開発コンソールに表示される[[Object, "success", Object], [Object, "success", Object]])。 _.eachは、それを正しくresult, idxに解凍することができます。

しかし、約束が1つしかない場合は、thenハンドラで1つの配列しか取得できません。それは_.eachを混乱させます。 eachは、単一の配列と結果を3つの関数呼び出しに展開します。私のアプリは失敗します。

これを回避するために、私は約束の数をチェックします。一つだけがある場合、私は$.whenを使用しません:それはこの結果を達成するための唯一の方法

if jsonPromises.length is 1 
    jsonPromises[0].done (model) => 
     action = newContentActions[0] 
     action model 
    else 
    $.when.apply($, jsonPromises) 
    .then (args...) => 
     _.each args, (result, idx) => 
     return unless result[1] is 'success' 
     action = newContentActions[idx] 
     action result[0] 

ですか?小切手 jsonPromises.length is 1を削除する方法はありますか?

答えて

0

私のソリューションは、あなたがjsonPromises.lengthは1

$.when.apply($, jsonPromises) 
    .then (args...) => 
    args = [args] if jsonPromises.length is 1 
    _.each args, (result, idx) => 
    return unless result[1] is 'success' 
    action = newContentActions[idx] 
    action result[0] 
であることを見ればただの配列で引数をラップすることです
関連する問題