编程语言
首页 > 编程语言> > javascript – 如何添加一个新的jquery延迟到现有的$.when?

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