gpt4 book ai didi

javascript - 如何在不需要等待的情况下使用 jquery deferred

转载 作者:行者123 更新时间:2023-11-30 12:32:13 25 4
gpt4 key购买 nike

当一个函数返回一个 promise 时,我可以在第一个函数完成后调用其他函数:

do_stuff().then(function(){
alert('yoooo');
});

do_stuff() 看起来像这样:

function do_stuff(){

if(!got_the_data){

var d = $.Deferred();

$.ajax({
success: function(html){
$('#box').append(html);
$('#box').addClass('visible');
$('#box').on('transitionend webkitTransitionEnd', function(){
got_the_data = true;
d.resolve();
});
}
});

return d.promise();

}else{
// got the data, what now?
}
}

但是如果我已经执行了 ajax 请求(结果已缓存)并且我不必等待任何事情,我应该返回什么?我无法返回 d.resolve() 因为附加到 then() 的函数不会触发:/

我不能返回 d.promise 因为我必须在某处解析“d”

最佳答案

您可以在两种方法中进行选择;缓存数据或缓存 promise 。

这里有两个示例,它们都是 url 上的键,但也可以根据需要使用任何其他键 - 只要它唯一标识每个个案。

缓存数据

var dataCache = {};

function do_stuff_1(url) {
if(dataCache[url] === undefined) {
return $.ajax({
url: url
}).then(function(data) {
dataCache[url] = data;
return data;
});
} else {
return $.when(dataCache[url]);
}
}

缓存 promise

var promiseCache = {};

function do_stuff_2(url) {
if(!promiseCache[url]) {
promiseCache[url] = $.ajax({
url: url
});
}
return promiseCache[url];
}

在这两种方法中,函数将(除非 Uncaught Error )通过执行 $.ajax() 或通过从缓存中检索数据/promise 来返回一个 promise。

在大多数应用程序中,几乎没有什么可以将一种方法与另一种方法区分开来。

在缓存可能会变大的应用程序中,缓存数据并避免缓存 promise 包装器的开销。

如有必要,可以预加载缓存,从而避免获取已知数据的需要:

var dataCache = {
'/path/to/data/a': 'A',
'/path/to/data/b': 'B'
}

var promiseCache = {
'/path/to/data/a': $.when('A'),
'/path/to/data/b': $.when('B')
}

关于javascript - 如何在不需要等待的情况下使用 jquery deferred,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349544/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com