4

不确定这是否可能,但我会试一试。我有一个延迟函数,它调用服务器来创建或更新和对象。例如:

var createOrUpdate = function(item) {
    var self = this;
    var deferred;

    if (item.id && item.id > 0) {
        updated = true;
        deferred = update.call(self, params);
    } else {
        deferred = create.call(self);
    }

    return deferred;
};

create 和 call 方法返回延迟的地方。这将允许我打电话

foo.createOrUpdate(bar).then(function(response) {
    // something happened
});

但是我希望能够添加一些自定义延迟处理程序,以便我可以做到这一点

foo.createOrUpdate(bar).created(function(response) {
    // an item was created
}).updated(function(response) {
    //an item was updated
});

首先,这是否可能。其次,如果是这样,我将如何去做。

基本上我想创建一个自定义的延迟处理程序。

非常感谢。

4

2 回答 2

1

没有真正测试过:

var createOrUpdate = function(item) {
  return {
    isUpdated : item.id && item.id > 0,
    created   : function(cb) {
      if (! this.isUpdated)
        create.call(self).then(cb);
      return this;
    },  
    updated   : function(cb) {
      if (this.isUpdated)
        update.call(self, params).then(cb);
      return this;
    }   
  };  
};  

foo.createOrUpdate(bar)
  .created(function(response) {
    // an item was created
  })
  .updated(function(response) {
    //an item was updated
  });
于 2013-04-18T17:18:11.013 回答
1

一种解决方案是制作自己的$.Deferred对象,并使用.resolve发送一个参数来说明它是哪种方法。

例如:

function create(){
    var deferred = new $.Deferred;

    $.post('/your/AJAX/call', {your: data}, function(retData){
        deferred.resolve('create', retData);
    });

    return deferred.promise();
}

function update(params){
    var deferred = new $.Deferred;

    $.post('/your/AJAX/call', {your: data, also: params}, function(retData){
        deferred.resolve('update', retData);
    });

    return deferred.promise();
}

保持createOrUpdate不变,您可以使用.then,并且您将从.resolve.

foo.createOrUpdate(bar).then(function(method, response) {
    switch(method){
        case 'update':
            break;
        case 'create':
            break;
    }
});

这是一个小演示:http: //jsfiddle.net/U5jyJ/

于 2013-04-18T19:12:37.960 回答