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

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

这是我得到的:

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

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

相关的例子

我看到你已经接受了一个答案,但是如果你进行了大量的精神飞跃并存储了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; }; 

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

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

 getChapters().then(fnLoad); 

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