在AngularJS中构建流畅的服务

在AngularJS中构建流畅的服务,angularjs,fluent,Angularjs,Fluent,我在AngularJS有一个简单的工厂: (function(){ 'use strict'; angular .module('myModule', []) .factory('myService', service); function service(){ var products= function(p1, p2, p3, ..., pn) { var url = "http://somethin

我在AngularJS有一个简单的工厂:

(function(){
'use strict';

    angular
        .module('myModule', [])
        .factory('myService', service);

    function service(){
        var products= function(p1, p2, p3, ..., pn) {
            var url = "http://something.url/api/action";
            var data = {
                'p1': p1,
                'p2': p2,
                ...
                'pn': pn,
            }

            // return data           
            return $http
                .post(url, data)
                .then(function (response) {
                    return response.data;
                });
        }

        return {
            Products : products
        };
    }
})();
我在控制器中使用此服务,如下所示:

myInjectedService
    .Products(vm.p1, vm.p1, ... , vm.pn)
    .then(successCallbackFn)
    .catch(failureCallbackFn);
每个参数(
p1
,…,
pn
)用于过滤最终结果。这很有魅力!但是有一个小缺点:
产品有很多公认的参数,很难知道我是否发送了正确的参数,这听起来有点容易出错。我想为服务提供一个流畅的API,使所有内容都更具可读性,这将非常好:

myInjectedService
    .Products()
    .FilterById(p1)
    .WhereCategoryIs(p2)
    ...
    .WhereSomethingElseIs(pn)
    .Send()
    .then(successCallbackFn)
    .catch(failureCallbackFn);

以前HTTP调用的任务是由
Products
call处理的。现在
Products()
,只做一个空查询(即
{}
)。每个后续的
FilterByX
都将丰富查询内容(即
{'productId':'xxx-yyy-1111'}
)。调用
Send()
将进行真正的HTTP POST调用。此调用将使用通过应用的各种筛选器生成的
数据。我该怎么做?我正在玩prototype,但没有成功。

您可以通过定义一个新类并像这样使用prototype来构建您想要的

在fluent方法中,记住返回对象本身

函数服务(){
变量产品=函数(url){
//定义一个新的产品类
var乘积=函数(){
this.url=url;
this.data={};
};
//添加函数
Products.prototype.FilterById=函数(id){
this.data.id=id;
//要使其流畅,请返回对象本身
归还这个;
};
Products.prototype.FilterByCategory=功能(类别){
this.data.category=类别;
归还这个;
};
Products.prototype.send=函数(){
console.log(this.data);
};
//返回Products类的实例
退回新产品();
};
返回{
产品:产品
};
};

服务().Products().FilterById(1.FilterByCategory(“项目”).send()
Products
类可以在
Products
方法外部声明,但仍然在服务函数内部,因此不会在每次调用
Products()
时声明。