自定义JQuery延迟处理程序

Custom JQuery deferred handler

本文关键字:程序 处理 延迟 JQuery 自定义      更新时间:2023-09-26

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

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
});

首先,这可能吗?其次,如果是这样,我该怎么做呢?

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

许多谢谢。

没有真正测试:

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
  });

一个解决方案是创建自己的$.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/