2013-04-18 209 views
4

不知道這是否可能,但我會給它一個去。我有一個延遲函數,可以調用服務器來創建或更新對象。例如:自定義JQuery延遲處理程序

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

首先,這是可能的。其次,如果是這樣,我將如何去做。

基本上我想創建一個自定義的延遲處理程序。

非常感謝。

+0

你必須實現一個自己。 –

+0

我明白這一點。這就是我想要做的。並希望得到一些指針:D –

+0

爲什麼'.created()'和'.updated()'會爲'.progress()','.done()','.fail()'或' 。()'還沒有做?我建議你需要安排'create()'和'update()'函數來解析它們各自的Deferreds,它們有一些值(或者是一個對象的屬性)來標識哪個動作('create'或'update')已經成功完成。爲什麼要讓事情更復雜? –

回答

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

當我開車回家時,它只是爲我而絞。這幾乎是我前往的地方。看起來很正確,但我會在早上檢查。 –

1

一種解決方案是使自己的$.Deferred對象,並使用.resolve發送PARAM,說這是一種方法。

例如:

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/