javascript - 如何将回调样本转换为延迟对象?

标签 javascript jquery jquery-deferred promise

我有一个接受回调函数的函数,我在其中将数据传回。可以将其转换为延迟对象以便更好地练习吗?

这是我得到的:

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

如何在保持缓存方法的同时像 promise 一样使用它?

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

最佳答案

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

关于javascript - 如何将回调样本转换为延迟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17639408/

相关文章:

javascript - 如何测试浏览器是否支持关键帧步进动画?

javascript - 分离 javascript 和 html 以获得可读代码

javascript - 使用jquery实现div动画

jquery - 使用 ShimConfig 的 Requirejs 2.0 和带有插件的 jQuery 是否需要路径?

jquery - 仅当一系列流程通过时才使用 jQuery 延迟提交表单

javascript - 隐藏/显示按钮没有隐藏我的 div

javascript - 在 HTML 中自定义单选按钮并删除可检查的圆圈

javascript - 是否可以让一种类型的类型基于另一种类型的值?

jquery - 'rejected' 对于 jqXHR 之外的延迟对象意味着什么?

javascript - 如何将 jQuery 的延迟对象与自定义 javascript 对象一起使用?