微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jQuery延迟:$.when()包含多个对象

我需要一种方法来使用回调来获取不同的脚本.
这种方法可行:
fetchScripts:function() {
    var _this=this;
    $.when(
        $.ajax({
            url:_this.url + 'library/script-one.js',type:'get',cache:true
        }),$.ajax({
            url:_this.url + 'library/script-two.js',{ .... },$.ajax({
            url:_this.url + 'library/script-n.js',cache:true
        })
    ).then(function() {
        console.log('fetch is done');

    })
},

但我想更加概括该方法,因为冗余正在增加.
是否有可能将承诺传递给$.when()?
在我的第一次尝试之下 – 但是url总是相同的,即’script-n.js’
也许我错过了这一点,你可以说明一个更“美”的解决方

fetchScripts:function() {
    this.deferred=new $.Deferred();
    this.promise=this.deferred.promise();
    var _this=this;
    $.each([
        'script-one.js','script-two.js',( .... ),'script-n.js'
    ],function() {
        _this.script=this;
        _this.promise.then(function(){
            return $.ajax({
                url:_this.url + 'library/' + _this.script,cache:true
            })
        });
    });
    $.when(
        this.promise
    ).then(function() {
        console.log('fetch is done');

    });
    this.deferred.resolve();
},

解决方法

你还需要$.when.但相反,创建一个Deferreds(或promises)数组,然后创建 apply到$.when:
fetchScripts:function() {
    var base = this.url;
    var defaults = {
        type:'get',cache:true
    };

    var libraries = [
        'library/script-one.js','library/script-two.js','library/script-n.js'
    ];

    var deferreds = $.map(libraries,function(current) {
        var ajaxOptions = $.extend({ url:  base + current },defaults);
        return $.ajax(ajaxOptions);
    });

    $.when.apply($,deferreds).then(function() {
        console.log('All done');
    });
}

或者扩展认设置,您可以使用$.ajax(defaults).

原文地址:https://www.jb51.cc/jquery/178019.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐