如何添加延迟到现有$.when的新jquery
How can I add a new jquery deferred to an existing $.when?
我正在重构一个资源加载函数,该函数使用传统的回调模式来代替jQuery Deferred。
此函数获取一个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()) {
return $.when(theLib.currentDeferred).always(function() {
theLib.getResources(paths);
}).promise();
}
以上都是失败的。正确的解决方案是通过管道传输结果:
if ( ! theLib.currentDeferred.isResolved()) {
return theLib.currentDeferred.pipe(function() {
return theLib.getResources(paths);
});
}
相关文章:
- jQuery.when()在循环中被忽略
- 为什么有些jQuery程序员使用像$.get、$.getJSON和$.when这样的jQuery函数来代替$.ajax
- Jquery:$.when根据参数的数量表现不同
- jQuery.when() 需要清除
- Jquery动画和when函数
- 使用 jquery.when 和 done 将值从一个 ajax 调用传递到另一个
- 如何在使用jQuery$.when执行多个请求时将响应分配给请求
- 我可以将Promises传递给jQuery.when(),还是只传递Deferred
- jQuery.when的后期绑定
- 使用jQuery.when时进行了奇怪的变量初始化
- .when 在 jquery 中出现问题
- jQuery 使用 .when 并推送数组
- jQuery.when, 无法获得 gata.
- jQuery.when 函数,在 ajax 调用完成后无法获取值
- 如何与 JQuery WHEN 和 THEN 同步两个骨干获取调用
- jQuery $.when(..).完成(..)未按预期工作
- 如何使用 jquery .when 访问 json 数据以附加到页面
- jQuery: $.when 延迟的 AJAX 调用 — 一个失败的调用会取消其他调用
- 有没有更简单的方法可以为不同的选择器链接不同的 jQuery 操作,然后嵌套 $.when
- Callback event when jQuery 'mmenu' closed