我试图在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
对象?
谢谢!
答案 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
方法,因为它将被执行。