6

页面上有几个模块:

// module 1
require(['signalr'], function(s) {
    s.subscribe('myhub1', function () { /* some code */ });
});

// module 2
require(['signalr'], function(s) {
    s.subscribe('myhub2', function () { /* some code 2 */ });
});

并且有一个方法应该在调用所有模块之后调用(所有订阅都完成):

require(['signalr'], fuinction (s) { s.connect(); });

可能的解决方案是定义模块并像这样编写:

// module 1
define('module 1', ['signalr'], function(s) {
    s.subscribe('myhub1', function () { /* some code */ });
});

// module 2
define('module 2', ['signalr'], function(s) {
    s.subscribe('myhub2', function () { /* some code 2 */ });
});
require(['signalr', 'module 1', 'module 2'], fuinction (s) { s.connect(); });

但问题是不同的页面有不同的模块,比如:

page1.cshtml:模块 1

page2.cshtml:模块 1、模块 2

所以我不能写: require(['signalr', 'module 1', 'module 2'], fuinction (s) { s.connect(); }); 因为模块 2 可能未在 page2.cshtml 上定义。

4

1 回答 1

3

最好的方法是有条件地构建一个数组并将其传递给 require 函数,然后如您在问题中提到的那样在回调中运行您的完成。

var modulesToLoad = [];

// Build the array

require(modulesToLoad, function (s) { 
    s.connect(); 
});

如果由于某种原因您无法将调用汇总到单个要求中,则需要跟踪要加载的模块并运行所有已加载的完成检查,然后运行您的清理代码

var checkIfLoaded = {
    myhub1 : false,
    myhub2 : false,
    myhub3 : false
}

function checkIfReady(s) {
    for (var prop in checkIfLoaded) {
        if ( ! checkIfLoaded[prop] ) {
            return false;
        }
    }

    // Completion code
    s.connect();
}

require(['myhub1'], function(s) {
    checkIfLoaded.myhub1 = true;
    checkIfReady(s);
});

require(['myhub2'], function(s) {
    checkIfLoaded.myhub2 = true;
    checkIfReady(s);
});

考虑到这一点,您应该能够构建一个需求数组

于 2013-05-27T10:50:09.247 回答