Ember / RSVP传递给resolve()

时间:2016-10-03 13:22:10

标签: ember.js rsvp.js

我试图在Ember RSVP承诺中包装一个jQuery AJAX请求,我遇到这个问题,我发送给resolve函数的值(jqXHR参数)从{更改} {1}}至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);
  });
});

现在,从我对RSVP.Promise的基本(也可能是有缺陷的)理解,promise.then((response) => { console.log(response); if (response.status === 200) { something... } else { something else... } receipt.set('busy', false); }); resolve(jqXHR)对象作为参数发送给回调,正确?

问题是,当我打印出我在控制台中的jqXHR时,我得到的只是response,这是我所做的HTTP请求的主体。

但是,当我在解析之前打印200 success时,它会正确打印整个对象:

jqXHR

那为什么会这样呢? Ember是否正在做一些奇怪的黑魔法并将Object {readyState: 4, responseText: "200 success", status: 200, statusText: "OK"} 对象转换为字符串?或者发送jqXHR字符串代替我期待的data对象?

谢谢!

1 个答案:

答案 0 :(得分:1)

知道了!

好吧,显然s2检查发送到rsvp.js方法的对象是否“可以”(可以读取),即它是否包含resolve方法。

如果它是'thenable',它将执行对象的then方法,取其第一个参数(仅)并将其作为实现值。这个小魔法允许链接解析,但对于带有多个参数的回调不能很好地工作。

所以在我的情况下,我发送jqXHR来解析,它确实包含then方法(根据jQuery documentation)。然后RSVP尝试将jqXHR对象作为promise来实现,并返回then回调的第一个参数。

现在,jqXHR解析回调的签名是resolve,这就是为什么发送到MY回调的对象不是我预期的function(data, textStatus, jqXHR);,而是{{1}的第一个参数。解决回调:jqXHR

TL; DR:检查您尝试解决承诺的对象是否具有jqXHR方法,因为它将被执行。