javascript加载外部文件并继续处理

javascript加载外部文件并继续处理,javascript,callback,Javascript,Callback,因此,我试图在用户需要某些脚本之前避免加载它们,但我总是使用if…else并在两个位置调用continue代码。在下面的代码中,您可以看到对continueProcessing()方法的两个调用。有更好的方法吗 if (typeof sessionList === "undefined" || typeof sessionList != "function") { $.getScript('resources/sessionList.js', function() { continu

因此,我试图在用户需要某些脚本之前避免加载它们,但我总是使用if…else并在两个位置调用continue代码。在下面的代码中,您可以看到对continueProcessing()方法的两个调用。有更好的方法吗

if (typeof sessionList === "undefined" || typeof sessionList != "function") {
  $.getScript('resources/sessionList.js', function() {
    continueProcessing();
  });
} else {
  continueProcessing();
}


function continueProcessing() {
    // do stuff
}

这对我来说似乎是一种很好的方式。

这对我来说似乎是一种很好的方式。

我没有使用过getScript,但在加载html模板时遇到了类似的挑战。我一直在使用延迟/承诺的方法。对于您的案例,它看起来是这样的:

var jqXHR = {};
if (typeof sessionList === "undefined" || typeof sessionList != "function") {
    jqXHR = $.getScript('resources/sessionList.js');
}
$.when(jqXHR).then(continueProcessing());
在脚本已经存在的情况下,jqXHR变量将不会被延迟,因此“then”将立即执行


这仍然需要输入一些代码,但至少“continueProcessing”只出现一次。

我没有使用getScript,但在加载html模板时遇到了类似的挑战。我一直在使用延迟/承诺的方法。对于您的案例,它看起来是这样的:

var jqXHR = {};
if (typeof sessionList === "undefined" || typeof sessionList != "function") {
    jqXHR = $.getScript('resources/sessionList.js');
}
$.when(jqXHR).then(continueProcessing());
在脚本已经存在的情况下,jqXHR变量将不会被延迟,因此“then”将立即执行


这仍然需要输入一些代码,但至少“continueProcessing”只出现一次。

所以我使用了$.Deferred模式/代码,我想出了这个。虽然没有那么简洁,但我认为这是一种更干净的方式。看起来我有很多代码要重构

    var dfd = $.Deferred();

    if ( typeof sessionList === "undefined" || typeof sessionList != "function" ) {
        $.getScript('resources/sessionList.js', function(){
            dfd.resolve();
        });
    }

    dfd.done(function() {
       continueProcessing();
    });

所以我使用了$.Deferred模式/代码,我想出了这个。虽然没有那么简洁,但我认为这是一种更干净的方式。看起来我有很多代码要重构

    var dfd = $.Deferred();

    if ( typeof sessionList === "undefined" || typeof sessionList != "function" ) {
        $.getScript('resources/sessionList.js', function(){
            dfd.resolve();
        });
    }

    dfd.done(function() {
       continueProcessing();
    });

更好的方法意味着更少的代码&调用continueProcessing()一次而不是两次?我不知道。在我看来,这并不正确,但我唯一能想到的是在循环中使用计时器,这似乎更糟。我绝对不想把这件事搞得太复杂,这就简单多了。更好的方法意味着更少的代码&调用continueProcessing()一次而不是两次?我不知道。在我看来,这并不正确,但我唯一能想到的是在循环中使用计时器,这似乎更糟。我绝对不想把这件事搞得太复杂,那就简单多了。不需要使用
$。如果只有一个jqXHR作为jqXHR对象,那么当
已经实现了promise接口时。也不需要将
jqXHR
初始化为对象-最好使用
null
。谢谢。模板是我根据需要加载和缓存的另一个领域,因此它肯定适用。我见过jqXHR,但从未注意过它。一个快速的Google提示Deferred正在取代jqXHR。有什么想法吗?不需要使用
$。如果只有一个jqXHR作为jqXHR对象,那么当
已经实现promise接口时。也不需要将
jqXHR
初始化为对象-最好使用
null
。谢谢。模板是我根据需要加载和缓存的另一个领域,因此它肯定适用。我见过jqXHR,但从未注意过它。一个快速的Google提示Deferred正在取代jqXHR。有什么想法吗?我是个白痴。如果If…then没有触发,那么延迟语句就不会被命中。我知道这很糟糕,但一次尝试…抓住…最终会达到我想要的效果。我是个白痴。如果If…then没有触发,那么延迟语句就不会被命中。我知道这很糟糕,但是一次尝试…抓住…最终会达到我想要的效果。