翻好Ajax请求到观测量与RxJS

翻好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)的subscribeonNext方法只能采取单一值,其将需要具有全部包裹在所述消息数据。

之后没有进一步的数据传播

由于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); 
    }); 
+0

感谢,这是非常有用的 - 还有好多身边让我的头在RxJS :)我控制服务器也因此让自己感动,我弹跳'dataToSend'回的响应,以避免需要坚持下去。但我会设置一个秒杀,所以我可以理解你的答案是如何工作的...... –