Javascript 有没有可能从AngularJS工厂返回“this”?

Javascript 有没有可能从AngularJS工厂返回“this”?,javascript,angularjs,Javascript,Angularjs,在我的应用程序中,我有静态助手“类”,它们为我执行大量逻辑,在这个特定的例子中,这个类是消息传递类,执行需要访问三个不同服务(工厂)的逻辑 唯一需要引用此类的工厂是networking工厂,因为当收到某个数据包时,我需要强制消息传递从服务器更新它的数据库 下面是我尝试做的一个例子: angular.module('database', []).factory('$database', function() { // SQLite implementation return {

在我的应用程序中,我有静态助手“类”,它们为我执行大量逻辑,在这个特定的例子中,这个类是消息传递类,执行需要访问三个不同服务(工厂)的逻辑

唯一需要引用此类的工厂是networking工厂,因为当收到某个数据包时,我需要强制消息传递从服务器更新它的数据库

下面是我尝试做的一个例子:

angular.module('database', []).factory('$database', function() {
    // SQLite implementation

    return {
       // ...
    };
});

angular.module('networking', []).factory('$networking', ['$database', function($database) {
    // Websocket implementation
    if(packet.opcode == 8) {
        Messaging.update(this, $database);
    }

    return {
       // ...
    };
}]);

Messaging = {
    // Messaging implementation..
    update: function(networking, database) {
        if(networking === undefined) { ]
            console.log("Networking is undefined.");
            return;
        }

        if(database === undefined) {
            console.log("Database is undefined.");
            return;
        }

        // Messaging update implementation.
};
不幸的是,
网络未定义。
在尝试调用
消息。更新(此$database)
时,会显示消息,如上所示

注意:我不能简单地将$networking实现注入$scope并使用它,因为这是在“后端”处理的。此逻辑应完全独立于范围执行。每当服务器(Websocket实现)向客户机发送8的数据包操作码时,不管作用域如何,都应该执行此代码。这种执行完全是在后台完成的,用户甚至不知道它发生了

我也在使用
消息。在其他适用的地方(范围内)更新
,例如在
消息控制器
当用户发送消息时,我可以调用
消息。使用注入的
$networking
服务更新
。不幸的是,注射在这里不是一种选择

注意:创建消息传递即服务实现将创建一个依赖循环,因为我目前有三个服务
文件缓存、数据库、网络
,而消息传递实现需要这三个服务的功能。当收到消息时,需要网络获取本地SQLite数据库中不可用的用户信息。文件缓存用于在创建新线程时缓存用户化身图像,当然需要数据库来存储消息

这个图案怎么样

angular.module('networking', []).factory('$networking', ['$database', function($database) {

    var net = {
        ....
    };

    // Websocket implementation
    if(packet.opcode == 8) {
        Messaging.update(net, $database);
    }

    return net;
}]);

工厂方法没有实例化(与服务类似),返回的对象与应用程序其他部分中引用的对象相同。所以你不能用“this”来引用它。您可以这样做(尽管我不确定这是否是一个好的做法):

现在,您可以将“this”替换为“fac”


相反,我要做的是将消息传递模块包装为服务。为了删除循环依赖项,您需要创建另一个服务/工厂来包装所有这些服务。我不知道具体是怎么做的,因为我不知道您的依赖关系图,但我就是这么做的。

很抱歉,花了这么长时间,不得不更改大量代码才能使此模式正常工作。谢谢
//inside your factory
var fac = { //your factory object
};
return fac;