定义一个承诺,创建一个新的服务对象

马特奥普克

我对AngularJS中的promise系统和服务创建有疑问。我有一项称为客户的服务:

angular.module("app").factory("Customer", ["CustomerDBServices", "OfficesList", "$q",
    function(CustomerDBServices, OfficesList, $q){
        return function(customerID){

            var self = this;

            //attributes
            this.name = null;
            this.ID = null;
            this.code = null;
            this.isVisible = 1;
            this.showOffices = true;
            this.offices = new OfficesList();

            //constructor
            if(typeof customerID !== "undefined"){
                var metacustomer = CustomerDBServices.find({ID:customerID}, function(){
                    self.name = metacustomer.results.customer_name;
                    self.ID = metacustomer.results.customer_ID;
                    self.code = metacustomer.results.customer_internal_code;
                    self.isVisible = metacustomer.results.customer_is_visible;
                    self.getOffices();
                });
            }

            //add office to customer
            this.addNewOffice = function(){
                self.offices.addNewOffice();
            };

            //remove office from customer
            this.removeOffice = function(officeIndex){
                self.offices.removeOffice(officeIndex);
            };

            //show offices
            this.toggleOfficeVisibility = function(officeIndex){
                self.offices.toggleOfficeVisibility(officeIndex);
            };
}]); 

在该服务的“构造器”部分中,有一个对服务的AJAX调用,该服务从数据库中加载客户的属性。这是一个异步任务。在这种情况下我该如何做出承诺?我使用这样的客户服务:

var customer = new Customer(ID);

我想做些类似的事情

var customer = new Customer(ID).then(
        function(){...}, //success
        function(){...} //error
);

为此,我需要一个承诺。我必须create()在客户服务中编写方法编程吗?

angular.module("app").factory("Customer", ["CustomerDBServices", "OfficesList", "$q",
    function(CustomerDBServices, OfficesList, $q){
        return function(customerID){

            var self = this;

            //attributes
            this.name = null;
            this.ID = null;
            this.code = null;
            this.isVisible = 1;
            this.showOffices = true;
            this.offices = new OfficesList();

            //costructor
            this.create = function(){
                if(typeof customerID !== "undefined"){
                    var rest = $q.defer();
                    var metacustomer = CustomerDBServices.find({ID:customerID}, function(){
                        self.name = metacustomer.results.customer_name;
                        self.ID = metacustomer.results.customer_ID;
                        self.code = metacustomer.results.customer_internal_code;
                        self.isVisible = metacustomer.results.customer_is_visible;
                        self.getOffices();

                        rest.resolve("ok!");
                    });
                    return rest.promise;
                }
            }

            ...
            ...
            ...
}]);

然后像这样使用这些东西?

var customer = new Customer();
customer.create(ID).then(
    function(){...},
    function(){...},
)

是否没有办法称呼“新客户”并获得承诺?先感谢您!

本杰明·格伦鲍姆(Benjamin Gruenbaum)

就像我在评论中说的那样,我建议您反对这种方法。将复杂的异步逻辑放在构造函数中通常会造成混淆,并且并不能构成非常好或清晰的API。

就是说,您不需要.create方法。

诀窍是:如果一个称为构造函数的函数在JavaScript中返回一个对象-则返回该对象而不是this值。

为您省去整个Angular的麻烦:

function(CustomerDBServices, OfficesList, $q){
    return function(customerID){

        var p = $q.defer();
        var that = p.promise; // our 'that' is now a promise

        //attributes
        that.name = null;
        that.ID = null;
        that.code = null;
        that.isVisible = 1;
        that.showOffices = true;
        that.offices = new OfficesList();
        // use `that` instead of this in additional code

        if(typeof customerID !== "undefined"){
            var metacustomer = CustomerDBServices.find({ID:customerID}, function(){
                self.name = metacustomer.results.customer_name;
                self.ID = metacustomer.results.customer_ID;
                self.code = metacustomer.results.customer_internal_code;
                self.isVisible = metacustomer.results.customer_is_visible;
                self.getOffices();
                that.resolve("ok!");
           });
       }
        return that; // we return the promise here.
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

定义一个承诺,创建一个新的服务对象

来自分类Dev

期望创建一个新对象

来自分类Dev

从服务中返回一个承诺

来自分类Dev

复制模板对象以从中创建一个新对象

来自分类Dev

遍历对象数组并创建一个新对象

来自分类Dev

在对象的定义内创建一个对象

来自分类Dev

用另一个新的承诺拒绝承诺

来自分类Dev

创建一个接受类型对象的通用方法并返回一个新的类型对象

来自分类Dev

如何基于数组和另一个对象创建一个新对象?

来自分类Dev

需要时保留一个对象或创建一个新对象。哪个更好?

来自分类Dev

AngularJS / JavaScript从另一个对象创建一个新对象

来自分类Dev

如何使用 Python 从另一个对象创建一个新的 JSON 对象?

来自分类Dev

如何创建一个按钮,使新对象成为 Swift 中的前一个对象?

来自分类Dev

创建一个使用服务的新AuthorizationHandler / IAuthorizationRequirement

来自分类Dev

函数定义一个新的对象类

来自分类Dev

使用jQuery创建一个新的select下拉对象

来自分类Dev

创建一个填充有对象新实例的列表

来自分类Dev

从另一个实例创建新对象

来自分类Dev

强制Django UpdateView改为创建一个新对象

来自分类Dev

要求用户创建一个新对象?

来自分类Dev

如何创建一个新的Bundle对象?

来自分类Dev

使用每个数组创建一个新对象

来自分类Dev

创建一个新对象,而不是引用

来自分类Dev

强制Django UpdateView改为创建一个新对象

来自分类Dev

创建一个Javascript对象的新实例

来自分类Dev

如何从现有值创建一个新对象?

来自分类Dev

用另一个类创建新对象

来自分类Dev

如何从退出一个创建新的json对象?

来自分类Dev

如何创建一个新的Bundle对象?

Related 相关文章

热门标签

归档