Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在angularjs中将套接字实现为$http_Angularjs_Sockets_Http - Fatal编程技术网

在angularjs中将套接字实现为$http

在angularjs中将套接字实现为$http,angularjs,sockets,http,Angularjs,Sockets,Http,我在服务器上实现了Primus(Sockets),并希望通过使用AngularJS的客户端访问它。我希望仍然能够使用像Restanglar或Angular的$resource这样的库。因此,IMHO实现这一点的最佳方法是扩展$http服务,它被大多数库用作基础 我希望这个新服务能够在没有可用套接字连接的情况下优雅地返回到正常的$http 在伪代码中: socketHttpService = function(config) { if(socketEnabled) { va

我在服务器上实现了Primus(Sockets),并希望通过使用AngularJS的客户端访问它。我希望仍然能够使用像Restanglar或Angular的$resource这样的库。因此,IMHO实现这一点的最佳方法是扩展$http服务,它被大多数库用作基础

我希望这个新服务能够在没有可用套接字连接的情况下优雅地返回到正常的$http

在伪代码中:

socketHttpService = function(config) {
    if(socketEnabled) {
        var message = buildMessageFromConfig();
        primus.write(message);
        return promise;
    }
    return $http(config);
}
像调用$http一样调用它

socketHttpService({method: 'GET', url: '/someUrl'}).then(function() {
    // do whatever
});
我的问题是,如何用这个新创建的服务替换标准的$http服务?在保留默认的$http行为的同时,是否有一种优雅的方法

与此同时,我找到了解决问题的办法

.config(function($provide) {
    $provide.decorator('$httpBackend', function($delegate, $q, $log, SocketService) {

        // do not blast mock $httpBackend if it exists
        if (angular.isDefined(angular.mock)) {
            return $delegate;
        }

        var httpBackendSocket = function(method, url, post, callback, headers, timeout, withCredentials, responseType) {
            if(SocketService.isOpen) {
                console.log('open');
                method = method.toLowerCase();
                // we only know get, post, put, delete
                if(method === 'get' || method === 'post' || method === 'put' || method === 'delete') {
                    // we can not handle the authentication links via sockets, so exclude them
                    if( url.substring( 0, '/api/v1/currentuser'.length ) !== '/api/v1/currentuser' &&
                        !angular.equals(url, '/api/v1/login') &&
                        !angular.equals(url, '/api/v1/logout') &&
                        !angular.equals(url, '/api/v1/session') ) {

                        var promise = SocketService.writeRest(method, url, post || {});
                        return promise.then(function promiseSuccess(response) {
                            return callback(response.status, response.data, response.headers, '');
                        }, function promiseError(response) {
                            // is caught via http handlers
                            // LATER: If error, retry with $httpBackend ($delegate)
                            return callback(response.status, response.data, response.headers, '');
                        });
                    }
                }
            }

            return $delegate(method, url, post, callback, headers, timeout, withCredentials, responseType);
        }

        return httpBackendSocket;
    });
})
为什么??因为它感觉比http快5倍,因为有一个固定的连接,而且我没有丢失任何实时选项。就像上面的樱桃


向您致以亲切的问候

这当然是可能的,但我必须问一下——为什么?套接字和HTTP消息本质上是不同的。HTTP是无状态的,是为表示资源或文档的结构化响应而构建的。套接字用于更实时的数据。我不认为在一般情况下,对他们一视同仁是一个很好的抽象概念。