我正在努力解决某件事 - 我猜这意味着我误解了并且正在做一些愚蠢的事情
我有一个可观察对象,需要使用它来创建一些对象,将其发送到服务器进行处理,将服务器的结果与我发送的对象结合起来,然后将其转换为可观察对象,所以我想要做什么(我认为)就像是
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 签名所以我显然在做一些愚蠢的事情
有几件事应该会有所帮助:
1) The subscribe
method 是一个终端方法,它不会返回任何内容。正是在这里Observer
附加,因此在之后不应有进一步的数据传播subscribe
2) The onNext
的方法subscribe
只能采用单个值,您需要将所有消息数据包装在其中。
自从 jQuery 的Promise
这样做不会表现得很好,你有两个选择。首先,您可以使用RX-DOM https://github.com/Reactive-Extensions/RxJS-DOM项目Observable
阿贾克斯版本。或者您需要包装 Promise 方法。如果您还需要等待响应,您应该使用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);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)