Javascript 使用RxJS将多个ajax请求转换为可观察的

Javascript 使用RxJS将多个ajax请求转换为可观察的,javascript,rxjs,Javascript,Rxjs,我正在与一些事情斗争——我猜这意味着我误解了,正在做一些愚蠢的事情 我有一个可观察的对象,需要使用它来创建一些对象,将其发送到服务器进行处理,将服务器的结果与我发送的对象相结合,然后将其转换为可观察的对象,所以我想做的事情是 var theNewObservable = my.observable.things.select(function(thing) { var dataToSend = generateMyJavascriptObjectFrom(thing);

我正在与一些事情斗争——我猜这意味着我误解了,正在做一些愚蠢的事情

我有一个可观察的对象,需要使用它来创建一些对象,将其发送到服务器进行处理,将服务器的结果与我发送的对象相结合,然后将其转换为可观察的对象,所以我想做的事情是

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
,我可以看到它有一个带有ajax onSuccess签名的onNext,所以我显然在做一些愚蠢的事情

一些应该会有帮助的事情:

1)
subscribe
方法是一个终端方法,如中所示,它不会返回任何内容。它是
观察者
附加的位置,因此在
订阅

2)
subscribe
onNext
方法只能获取一个值,您需要将所有消息数据包装在该值中

由于jQuery的
承诺
将无法很好地执行此操作,因此您有两个选择。首先,您可以将该项目用于可观察的ajax版本。或者您需要包装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);
  });

谢谢,这真的很有用-在RxJS中有很多东西可以让我动脑筋:)我也控制服务器,所以我会在响应中反弹
数据发送
,以避免需要保留它。但我会设置一个尖峰,这样我就能理解你的答案是如何工作的。。。