您得到这个是因为 $.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
方法返回一个承诺,该承诺在任何内部方法承诺完成时完成。
我知道这听起来有点复杂,但是请尝试一下并尝试一下。 :)