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

我看到你已经接受了一个答案,但是如果你在思想上做出很大的飞跃并存储一个 promisechapters而不是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;
};

实际承诺的内容(章节)将由函数返回的值决定Lawnchairthis.save因此您还有一些工作要做。

getChapters()将始终返回一个承诺,无论数据是需要获取还是已经缓存。因此,getChapters()只能与 promise 方法.then()、或一起使用.done(),例如:.fail().always()

getChapters().then(fnLoad);

您没有其他方法可以访问 ,chapters但这是合理的,因为在任何调用 时getChapters(),您都不知道它是跟随$.getJSON()分支还是简单return分支,两者都返回相同的承诺。

于 2013-07-14T14:12:20.883 回答