2013-06-13 7 views
5

私はいくつかのデータを取得する関数を持っており、関数は約束を返さなければなりません。この機能では、2つの要求を1つずつ行う必要があります。私は最後の呼び出しであるresolvesが遅延機能で返ってくる入れ子の延期呼び出しで終わった。私は、この遅延されたものには新しく、これが適切な解決策であるかどうか疑問に思います。入れ子になったjqueryの遅延呼び出しを処理する方法

function getData(func) { 
    var model = new Model(); 
    var collection = new Collection(); 
    var dfd = new jQuery.Deferred(); 

    collection.fetch().then(function() { 
     model.fetch().then(function() { 
      dfd.resolve(collection); 
     }); 
    }); 

    return dfd.then(function (collection) { 
     return getViews(func(collection), model); 
    }); 
} 
+0

。どちらのコードも.then()コールバック内のgetViews()を返します。概念的には、getData()関数が遅延された.then()を返し、getView()は遅延していないことを理解することが重要です。 getViews()を返すことはここで何もしません。追加の.then()呼び出しのように、このgetData()を使用する他のコードがある場合、getViewが完了することは保証されません。あなたはそれが始まったことだけが保証されます。問題を参照してください?知っているだけのこと。 – jcbelanger

+0

'$ .when()。done()'をここに返すのでしょうか? –

+0

@ cereal77killer、 "getViews()はここで何もしていない"というあなたの主張は(jQuery 1.8から)間違っています。内側の 'return'は、' getData() 'によって返される約束があなたが望むように振る舞うように明示的に含まれています。つまり、 'getData()'によって返される約束に '.then()'を連鎖させる場合、 'getViews()'が完全であることが保証されます**。あなたが私を信じていない場合、「as of jQuery 1.8」[ここ](http://api.jquery.com/deferred.then/)から始まる段落を読んでください。 '.done()'を使うと、あなたが避けようとしている振る舞いを正しく与えることができます。 –

答えて

5

Andreas、あなたはVitaliyの答えをかなり正しく受け入れていると思いますが、私は彼のポイントを盗もうとしていませんが、あなたが気づいていない場合は、自分自身を作成し​​て解決する必要はありません。$.Deferred()collectionfunc()を除く)は範囲内にとどまっています。私は、問題のコードから言うことができるように

は限り、以下の作業をする必要があります:私はあなたの質問や受け入れ答えでバグを発見したことがあり

function getData(func) { 
    var collection = new Collection(); 
    var model = new Model(); 
    return $.when(collection.fetch(), model.fetch()).then(function() { 
     return getViews(func(collection), model); 
    }); 
} 
5

呼び出しの順序は、私はあなたがパラレルXHRリクエストを行うことができますwhenhttp://api.jquery.com/jQuery.when

を使用することをお勧め問題ではない場合。

関連する問題