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);
});

キャッシュアプ​​ローチを維持しながら、どうすればそれを約束のように使用できますか?

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

2 に答える 2

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();
};

関連する例

于 2013-07-14T12:38:27.120 に答える
2

すでに答えを受け入れているようですが、大きな精神的飛躍を遂げてchapters、自分自身の代わりに約束を保存するchaptersと、コードは大幅に簡素化されます。

最近では、おそらくこれが「フェッチ/キャッシュ」の状況でより一般的に採用されているアプローチです。

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;
};

実際に約束されていること (章) は、関数Lawnchairおよびによって返される値によって決定されるthis.saveため、まだやるべきことがいくつかあります。

getChapters()データをフェッチする必要があるか、すでにキャッシュされているかに関係なく、常に promise を返します。したがって、 promise メソッド、、またはでgetChapters()のみ使用できます。たとえば、次のようになります。.then().done().fail().always()

getChapters().then(fnLoad);

にアクセスする他の方法はありませんが、chaptersの呼び出しでは、分岐に従うか単純な分岐getChapters()に従うかがわからないため、これは合理的です。どちらも同じ promise を返します。$.getJSON()return

于 2013-07-14T14:12:20.883 に答える