Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.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 允许可变长度参数为角度';新加坡元资源?_Angularjs_Angular Promise_Angular Resource - Fatal编程技术网

Angularjs 允许可变长度参数为角度';新加坡元资源?

Angularjs 允许可变长度参数为角度';新加坡元资源?,angularjs,angular-promise,angular-resource,Angularjs,Angular Promise,Angular Resource,问题是,我需要进行多个API调用,具体如下: www.domain.com/foo/bar?token=12345 中间可能有更多的子目录,但可能会更少 我目前正在使用$resource agentApp.factory('apiFactory', function($resource) { return $resource('www.domain.com/v1/' + ':folder', { 'query': { method: 'G

问题是,我需要进行多个API调用,具体如下:

www.domain.com/foo/bar?token=12345

中间可能有更多的子目录,但可能会更少

我目前正在使用$resource

agentApp.factory('apiFactory', function($resource) {
    return $resource('www.domain.com/v1/' + ':folder', 
    {
        'query': {
            method: 'GET',
            isArray: true
    }
});
其调用方式如下:

apiFactory.query({folder: 'foo', token: '12345'}, function() {...})
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });
apiService.query('/foo/bar?token=12345', true)
    .then(function(response) { ...do something with response });
我想让它更具可扩展性,因为我需要偶尔将
isArray
值更改为
false
,并且URL中的子目录数量有时是未知的,因此我宁愿不使用
$resource
:token
结构,而只使用一个带字符串的结构

我是否可以创建一项服务,使我能够按如下方式拨打电话:

apiFactory.query({folder: 'foo', token: '12345'}, function() {...})
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });
apiService.query('/foo/bar?token=12345', true)
    .then(function(response) { ...do something with response });
到目前为止,我尝试了以下几点,但显然没有给出我想要的,我不确定如何让$resource真正启动API调用,我把这归结为对$resource如何工作的根本误解:

agentApp.factory('apiService', ['$resource', '$q', function ($resource, $q) {
    var factory = {
        query: function (urlStringAndQueries, isArray) {
            return $q(
                function() {
                    $resource('www.domain.com/v1/' + ':location', { location: urlStringAndQueries }, {
                        'query': {
                            method: 'GET',
                            isArray: isArray
                        }
                    });
                }
            )
        },
    return factory;
}]);
我试图称之为:

apiFactory.query({folder: 'foo', token: '12345'}, function() {...})
apiService.query(urlStringAndQueries, booleanForIsArray).then(function(response) { ...do something with response });
apiService.query('/foo/bar?token=12345', true)
    .then(function(response) { ...do something with response });
非常感谢您的帮助和/或建议。 谢谢

编辑:这是我的解决方案,直到出现更通用的模式

由于
$response
固有地对URL进行编码,因此我无法在外部为基本URL字符串提供额外的实体,例如
foo/bar?token=12345
,因此字符(/?=)被转换为其编码的对应项。因此,在模式中分离字符串:

agentApp.factory('apiService', ['$resource', function($resource) {
    var factory = {
        resourceObj: function(isArray, urlStringAndQueries) {

            /* urlStringAndQueries will be variadic parameters,
            so we deconstruct them for use in the URL */

            var location1, location2, location3, locations = [];

            angular.forEach(arguments, function(path) {
                locations.push(path);
            });

            return $resource(vapiURL + vapiVer + '/' + ':location1' + '/' + ':location2' + '/' + ':location3' + '/' + ':location4', {
                location1: locations[1],
                location2: locations[2],
                location3: locations[3],
                location4: locations[4],
            }, {
                'query': {
                    method: 'GET',
                    isArray: isArray
                },
                'save': {
                    method: 'POST',
                    isArray: isArray
                }
            })
        }
    };
    return factory;
}]);
这个解决方案仍然假设有有限的路径,这并不理想,但至少很容易重用


仍然欢迎更多更好的建议:)

我不明白为什么您再次从服务方法返回承诺对象,而$resource return promise本身。不要那样做

代码

agentApp.factory('apiService', ['$resource', '$q', function($resource, $q) {
    var factory = {
        resourceObj: function(urlStringAndQueries, isArray) {
            return $resource('www.domain.com/v1/' + ':location', {
                location: urlStringAndQueries
            }, {
                'query': {
                    method: 'GET',
                    isArray: isArray
                }
            });
        )
    }
}]);
调用factory方法,然后您将获得对资源对象的访问权,然后调用该资源对象方法的
query

控制器

apiService.resourceObj('/foo/bar?token=12345', true).query()
    .then(function(response) { ...do something with response });

您可以编写一个直接使用
$http
而不是
$resource
的服务。谢谢@null我来试一试。谢谢@pankajparkar的帮助。您的代码目前存在一些问题-需要在服务结束时返回
工厂
对象变量,正如您正确提到的那样,
$resource
返回它自己的承诺,因此我们可以简单地在查询参数中编写函数。在您的帮助下,我编辑了我的答案,以反映我目前的解决方案。再次感谢。@KyleGillen如果对你有帮助的话,你可以投赞成票。。谢谢:)