我有一个接受回调函数的函数,我将数据传回来。这可以转换为延迟对象以便更好地练习吗?
这是我得到的:
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);
});
答案 0 :(得分: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();
};
答案 1 :(得分: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()
将始终返回一个承诺,无论数据是需要获取还是已经缓存。因此,getChapters()
只能与承诺方法.then()
,.done()
,.fail()
或.always()
一起使用,例如:
getChapters().then(fnLoad);
您无法访问chapters
,但这是合理的,因为在getChapters()
的任何调用中,您都不知道它是否会遵循$.getJSON()
分支或简单return
分支,两者都返回相同的承诺。