2012-08-06 51 views
3

我在想如何將參數傳遞給由jQuery的promise對象觸發的回調函數。我的方法,它調用了ajax,然後承諾的方法是這樣的:帶參數的jQuery Promise回調

var formObject = { 
    call : function(thisForm, thisUrl, thisArray, thisCallback) { 
     "use strict"; 
     var thisMethod = thisForm.attr('method').toUpperCase(); 
     var thisPromise = $.ajax({ 
      type : thisMethod, 
      url : thisUrl, 
      dataType : 'json', 
      data : thisArray, 
      cache : false 
     }); 
     thisPromise.done(thisCallback(data, textStatus, jqXHR)); 
     thisPromise.fail(formObject.topError(jqXHR, textStatus, errorThrown)); 
    } 
}; 

中所做的參數()和失敗()方法是不正確的 - 但是這正是我試圖弄清楚。

回答

2

沒有必要提供額外的倒閉 - 下面的線應該能正常運行:

thisPromise.done(thisCallback); 
thisPromise.fail(formObject.topError.bind(formObject)); 

done回調將通過$.ajax提供的data, textStatus, jqXHR參數。這一行只是直接註冊提供的回調函數。

fail回調同樣會得到正確的參數,只是我用.bind這裏來確保this正確設置爲formObject。如果此代碼將用於ES5之前的瀏覽器,則只需安裝墊片.bind - 上面鏈接的Mozilla網站上有一個。

+0

謝謝Alnitak - 這一個會好嗎? :https://gist.github.com/3140164 – 2012-08-06 08:24:29

+0

@SpencerMark是的,那應該沒問題。 – Alnitak 2012-08-06 08:25:14

1

嘗試寫而不是

thisPromise.done(function(data, textStatus, jqXHR) { 
    thisCallback(data, textStatus, jqXHR); 
}); 
thisPromise.fail(function(jqXHR, textStatus, errorThrown) { 
    formObject.topError(jqXHR, textStatus, errorThrown); 
}); 

包裝函數裏面兩個回調

+0

這不會工作 – Alnitak 2012-08-06 07:45:42

+0

@alnitak,前提是我對'thisCallback'和'formObject.topError'存在一無所知......爲什麼它不應該工作?如果這是由於缺乏參數,我剛剛更新了我的答案:) – fcalderan 2012-08-06 07:48:43

+0

是的,這是缺乏參數。參數在OP代碼中給出。你當然應該注意到提供的函數正在被傳遞_exactly_與回調相同的參數... – Alnitak 2012-08-06 07:54:06

1

使用閉:

var formObject = { 
    call : function(thisForm, thisUrl, thisArray, thisCallback) { 
     "use strict"; 
     var thisMethod = thisForm.attr('method').toUpperCase(); 
     var thisPromise = $.ajax({ 
      type : thisMethod, 
      url : thisUrl, 
      dataType : 'json', 
      data : thisArray, 
      cache : false 
     }); 
     thisPromise.done(function(data, textStatus, jqXHR) { 
       thisCallback(/* additional parameters*/) 
     }); 
.......................... 
    } 
};