簡體   English   中英

Ember / RSVP Promise值在傳遞給resolve()時發生更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM