[英]Ember/RSVP Promise value changes when passed to resolve()
我試圖將jQuery AJAX請求包裝在Ember RSVP jqXHR
,但是我遇到的問題是,我發送到resolve
函數的值(這是jqXHR
參數)從object
變為string
。
執行請求+創建請求的代碼如下:
return new Ember.RSVP.Promise(function(resolve, reject) {
Ember.$.ajax([URL], {
type: 'POST',
dataType: 'text'
}).then((data, textStatus, jqXHR) => {
console.log(jqXHR);
resolve(jqXHR);
}, (jqXHR, textStatus, errorThrown) => {
resolve(jqXHR);
});
});
在我的控制器中,我這樣處理請求:
promise.then((response) => {
console.log(response);
if (response.status === 200) {
something...
} else {
something else...
}
receipt.set('busy', false);
});
現在,從我對RSVP.Promise的基本理解(可能還有缺陷)中, resolve(jqXHR)
行應將 jqXHR
對象作為參數發送給回調,對嗎?
問題是,當我打印在控制台中獲得的response
時,我得到的只是200 success
,這是我執行的HTTP請求的主體。
但是,當我在解決jqXHR
之前打印jqXHR
時,它會正確打印整個對象:
Object {readyState: 4, responseText: "200 success", status: 200, statusText: "OK"}
那么為什么會這樣呢? Ember是否正在執行一些jqXHR
黑魔法並將jqXHR
對象轉換為字符串? 還是正在發送data
字符串來代替我期望的jqXHR
對象?
謝謝!
得到它了!
好吧,顯然rsvp.js
檢查發送到resolve
方法的對象是否為“ thenable”(可讀取然后可讀取),即它是否包含then
方法。
如果它是“ thenable”,它將執行該對象的then
方法,並采用其第一個參數(僅)並將其作為已實現的值。 這個小技巧可以實現鏈式解析,但是對於帶有多個參數的回調來說效果不佳。
因此,就我而言,我正在發送要解決的jqXHR,它確實包含一個then
方法(根據jQuery文檔 )。 然后,RSVP嘗試實現jqXHR對象作為一個Promise,並返回resolve
回調的第一個參數。
現在,jqXHR resolve回調的簽名是function(data, textStatus, jqXHR);
,這就是為什么發送到MY回調的對象不是我期望的jqXHR
,而是jqXHR
resolve回調的第一個參數: data
。
TL; DR:檢查您嘗試使用其解決承諾的對象是否具有then
方法,因為它將被執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.