翻好Ajax请求到观测量与RxJS
问题描述:
我的东西挣扎 - 我猜意味着我误解和正在做一些愚蠢的翻好Ajax请求到观测量与RxJS
我有一个观察的,需要用它来创建一些对象,发送到服务器进行处理,从我发出的对象的服务器相结合的结果,然后把它转换成一个可观察所以我想要做的(我认为)是一样的东西
var theNewObservable = my.observable.things.select(function(thing) {
var dataToSend = generateMyJavascriptObjectFrom(thing);
var promise = $.ajax({
type: 'POST',
url: http://somewhere.com,
data: dataToSend
}).promise();
return rx.Observable.fromPromise(promise).subscribe(function(data, status, jqXHR) {
var infoFromServer = jqXHR.getResponseHeader('custom-header-returned');
// I'm wanting this to be the thing other code can subscribe to
return { infoFromServer: dataToSend };
}, function(err) {
alert('PC LOAD LETTER!');
console.error(err);
});
}
});
theNewObservable.subscribe(function(combinedInfo) { console.log(combinedInfo) };
在哪里我期待{infoFromServer: dataToSend}
我得到一个AutoDetachObserver
,我可以看到有一个onNext与ajax onSuccess签名,所以我显然做索姆ething傻
答
一对夫妇的事情,应该有点帮助:
1)subscribe
方法是终端方法,如,它不会返回任何东西。它是其中Observer
附着所以应该有subscribe
2)的subscribe
的onNext
方法只能采取单一值,其将需要具有全部包裹在所述消息数据。
由于jQuery的Promise
在这方面表现不佳,因此您有两种选择。首先,您可以使用RX-DOM项目获得Observable
ajax版本。或者您需要包装承诺方法。如果您还需要等待响应,则应该使用selectMany
,这样您可以启动承诺,然后等待其返回并将响应映射到原始请求。
var theNewObservable = my.observable.things
//Preprocess this so that `selectMany` will use
//dataToSend as the request object
.map(function(thing) { return generateMyJavascriptObjectFrom(thing); })
.selectMany(function(dataToSend) {
var promise = $.ajax({
type: 'POST',
url: http://somewhere.com,
data: dataToSend
}).promise();
//Rewrap this into a promise that RxJS can handle
return promise.then(function(data, status, jqXHR) {
return {data : data, status : status, jqXHR : jqXHR};
});
}, function(request, response) {
return {
infoFromServer : response.jqXHR.getResponse('custom-header'),
dataToSend : request
};
});
theNewObservable.subscribe(
function(combinedInfo) {
console.log(combinedInfo)
},
function(err) {
alert('PC LOAD LETTER!');
console.error(err);
});
感谢,这是非常有用的 - 还有好多身边让我的头在RxJS :)我控制服务器也因此让自己感动,我弹跳'dataToSend'回的响应,以避免需要坚持下去。但我会设置一个秒杀,所以我可以理解你的答案是如何工作的...... –