使用全局变量和 $.getScript 时遇到困难

2023-12-25

我有以下脚本无法正常工作:

function getWidgetContent( widget ) {
    if(widget.script!=null){
        $global_widget_id = widget.widget_id;
        $.getScript( "js/" + widget.script, function() {
            $( ".widget_header_title_" + widget.widget_id ).append( widget.title );
        });
    }
}

这被称为如下:

for ( j = 0; j <= widget_data.d.length - 1; j++ ) {
    getWidgetContent( widget_data.d[j] );
}

我认为这会运行该函数,在函数内,为全局值分配一个值,然后运行$.getScript循环的每次迭代。但这并没有发生。它似乎迭代循环直到循环完成,假设它循环3次,每次为全局值分配一个值,即3次,然后它最终执行以下操作:$.getScript.

当然,这不起作用,因为它现在只会使用 $.getScript 文件中全局值的最后一次分配 3 次......

我如何更改它以便它为全局变量分配一个值,运行$.getScript。完成后,继续原来的循环,将下一个值分配给全局变量,运行$.getScript直到循环结束。


您得到这个是因为 $.getScript 是一个异步方法。在这种情况下,这意味着该方法在脚本完成加载之前立即返回,并继续执行其后的代码。

这意味着:

$.getScript('a.js', function () {
    console.log('Loaded a');
    }); 
$.getScript('b.js', function () {
    console.log('Loaded b');
    }); 
$.getScript('c.js', function () {
    console.log('Loaded c');
    }); 
// Output could be:
// Loaded c
// Loaded a
// Loaded b

这意味着所有脚本文件请求可以同时完成,但这也意味着顺序不确定(固定)。

使用承诺

您可以确保getWidgetContent通过链接顺序调用promises http://wiki.commonjs.org/wiki/Promises/A如果您使用的是 jQuery 1.5 及以上版本。 然而,这种方法的缺陷是你会not如果同时并发加载所有脚本请求,则前一个请求完成后,将依次发送请求。

确保返回 $.getScript 的结果,它是延迟对象 http://api.jquery.com/category/deferred-object/(我在这里做了很小的改变,只需注意return声明):

function getWidgetContent( widget ) {
  if(widget.script!=null){
    $global_widget_id = widget.widget_id;
    return $.getScript( "js/" + widget.script, function() {
        $( ".widget_header_title_" + widget.widget_id ).append( widget.title );
        });
  }
  return null;
}

在履行先前的承诺(完成先前的操作)后执行新的 getWidgetContent 的新方法:

function doGetWidgetContentAfter(promise, widget) {
  return promise.then(function () {
      return getWidgetContent( widget );
      });
}

调用它:

var promise = $.when(true);
for ( j = 0; j <= widget_data.d.length - 1; j++ ) {
  promise = doGetWidgetContentAfter( promise, widget_data.d[j] );
}

解释

What doGetWidgetContentAfter确实是当所说的promise做完了then打电话给getWidgetContent函数为widget. The then方法返回一个承诺,该承诺在任何内部方法承诺完成时完成。

我知道这听起来有点复杂,但是请尝试一下并尝试一下。 :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用全局变量和 $.getScript 时遇到困难 的相关文章

随机推荐