javascript - 使用 RxJS 将多个 ajax 请求转换为 Observables

标签 javascript 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 并且我可以看到它有一个带有 ajax onSuccess 签名的 onNext 所以我明明在做傻事

最佳答案

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

1) subscribe 方法是一个终端方法,因为它不会返回任何东西。它是 Observer 附加的地方,因此在 subscribe

之后不应有进一步的数据传播

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

由于 jQuery 的 Promise 对此表现不佳,您有两个选择。首先,您可以使用 RX-DOM Observable ajax 版本的项目。或者您需要包装 promise 方法。如果您还需要等待响应,您应该改用 selectMany,这将允许您触发 promise ,然后等待其返回并将响应映射到原始请求。

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);
  });

关于javascript - 使用 RxJS 将多个 ajax 请求转换为 Observables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33233881/

相关文章:

javascript - 仅替换网页上的文本以创建链接

Javascript rxjs 处理每个第 n 个错误

javascript - 使用 RxJS 如何缓冲函数调用,直到另一个异步函数调用已解决

javascript - 重新加载时保留数据 Angular 8

angular - 为什么我需要重新加载我的页面才能从 Angular 中的主题订阅中获取数据?

angular - 在 RxJS 中的 Observable<void> 上调用observer.next()

javascript - 如何使用无上下文语法从标记列表构造抽象语法树?

php - 添加json文件注释

javascript - free-jqgrid:保存、加载和应用过滤器数据(包括过滤器工具栏文本和页面设置)的更简单方法?

javascript - React-chart 不渲染 PIE 图表的图例