javascript – 如何添加一个新的jquery延迟到现有的$.when?
作者:互联网
我正在重构一个资源加载函数,它使用传统的回调模式代替使用jQuery Deferreds.
此函数接受url数组,为每个资源创建一个新的Deferred对象,创建$.when Deferred对象以观察它们,并返回$.when对象的promise.
这是该方法的简化版本:
theLib = {
getResources : function(paths) {
var deferreds = [];
theLib.isLoading = true;
$.each(paths, function(i, path) {
// do something with the path, either using getScript
// or making a new $.Deferred as needed
deferreds.push(/* the deferred object from above comment */);
});
theLib.currentDeferred = $.when.apply(null,deferreds).always(function() {
theLib.isLoading = false;
});
return theLib.currentDeferred.promise();
};
这很好用.
我的问题:在旧脚本中,不仅可以根据用户操作或事件调用theLib.getResources(),还可以定义应用程序将“流式传输”的资源的主列表,而用户不采取任何操作(即阅读文章).
其中一些流资源与用户执行操作时可手动调用的资源相同.该脚本足够聪明,不会通过跟踪加载的内容来加载资源两次.
它还跟踪theLib.isLoading.该函数的开头看起来像这样:
getResources : function(paths, callback) {
if (theLib.isLoading) {
settimeout(function() {
theLib.getResources(paths, callback);
}, 100);
}
theLib.isLoading = true;
我不能再这样做了,因为我需要返回一个promise对象.
我知道我可以检查theLib.currentDeferred.isResolved().此时,如果未解决:如何将更多延迟对象添加到正在监视的$.when队列中?
解决方法:
我想我需要问这个问题,为自己找一个解决方案.基本上我在getResources的开头添加了以下代码:
if(!theLib.currentDeferred.isResolved()){
返回$.when(theLib.currentDeferred).always(function(){
theLib.getResources(路径);
}).诺言();
}
以上是失败的.正确的解决方案是管道结果:
if ( ! theLib.currentDeferred.isResolved()) {
return theLib.currentDeferred.pipe(function() {
return theLib.getResources(paths);
});
}
标签:jquery,javascript,jquery-deferred 来源: https://codeday.me/bug/20190630/1338682.html