2013-07-14 1 views
6

私はデータを戻すコールバック関数を受け入れる関数を持っています。これをより良い練習のために遅延オブジェクトに変換できますか?ここでコールバックサンプルを遅延オブジェクトに変換するにはどうすればよいですか?

は、私が得たものである:

var chapters; 
    var getChapters = function (fnLoad) { 
     //CACHE DATA IF APPLICABLE 
     if (!chapters) { 
      //CALL JSON DATA VIA AJAX 
      $.getJSON('/chapters.txt') 
       .done(function (json) { 
        //STORE DATA IN LOCAL STORAGE 
        chapters = Lawnchair(function() { 
         this.save(json, function (data) { 
          //CALL CALLBACK ON DATA 
          fnLoad(data); 
         }); 
        }); 
       }); 
     } else { 
      //RETURN ALREADY CREATED LOCAL STORAGE 
      chapters.all(function (data) { 
       //CALL CALLBACK ON DATA 
       fnLoad(data); 
      }); 
     } 
    }; 

それから私は、単にこのようにそれを使用します。キャッシュ・アプローチを維持しながら、

this.getChapters(function (data) { 
    console.log(data); 
}); 

は、どのように私も約束のようにそれを使用することができますか?私はすでにあなたは大きな精神的な飛躍を取るとchaptersの約束の代わりchapters自分自身を保存する場合は、コードを大幅に簡略化されますが、答えを受け入れている参照

this.getChapters().done(function (data) { 
    console.log(data); 
}); 
+0

jQueryのajaxメソッドは、遅延オブジェクトを拡張します。あなたはすでにそれを使用しています... –

+0

私はデータを操作して、データを返す前に真ん中の "Lawnchair"を使用しているので、私はajaxオブジェクトを正しく返しません。 – TruMan1

+0

コメントはすべて大文字で入力してください。 – Eric

答えて

3
var chapters; 
var getChapters = function (fnLoad) { 
    var d = new $.Deferred(); 
    //CACHE DATA IF APPLICABLE 
    if (!chapters) { 
     //CALL JSON DATA VIA AJAX 
     $.getJSON('/chapters.txt') 
      .done(function (json) { 
       //STORE DATA IN LOCAL STORAGE 
       chapters = Lawnchair(function() { 
        this.save(json, function (data) { 
         //CALL CALLBACK ON DATA 
         d.resolve(data); 
        }); 
       }); 
      }) 
      .fail(function() { d.reject(); }); 
    } else { 
     //RETURN ALREADY CREATED LOCAL STORAGE 
     chapters.all(function (data) { 
      //CALL CALLBACK ON DATA 
      d.resolve(data); 
     }); 
    } 
    return d.promise(); 
}; 

Relevant example

2

最近では、これは「フェッチ/キャッシュ」の状況で一般的に採用されているアプローチです。実際に約束されて何

var chapters_promise; 
var getChapters = function() { 
    //Cache data if applicable and return promise of data 
    if (!chapters_promise) 
     chapters_promise = $.getJSON('/chapters.txt').then(Lawnchair).then(this.save); 
    return chapters_promise; 
}; 

(章)は、あなたはまだ行うにはいくつかの仕事を持っているので、機能Lawnchairthis.saveによって返される値(複数可)によって決定されます。

getChapters()は、データを取得する必要があるのか​​、既にキャッシュされているのかにかかわらず、常に約束を返します。したがって、getChapters()は、例えば約束方法.then().done().fail()または.always()、のみを使用することができます:

getChapters().then(fnLoad); 

あなたはchaptersにアクセスするための他の方法を持っていないが、それはgetChapters()のいずれかの呼び出しであるため合理的である、あなたドン$.getJSON()ブランチかブランチreturnブランチのどちらに従うかは分かりません。どちらも同じ約束を返します。

関連する問題