【问题标题】:How do I get the status of an Ajax call in Bacon.js?如何在 Bacon.js 中获取 Ajax 调用的状态?
【发布时间】:2013-10-21 11:30:13
【问题描述】:

jQuery 的 Ajax 处理程序在其 promise 解析时返回一个参数数组,初始元组是 ([data], "status")。我发现当我使用Bacon.fromPromise 时,我得到的只是数据。我将如何获取事务的状态,以及如何处理来自 jQuery 的任何实际故障?

我要做的是从两个不同的 URL 下载两个具有相同架构的数据包并将它们连接起来。我想我已经弄清楚了串联,但是错误处理让我发疯了。这是我正在尝试的:

requestData = Bacon.fromPromise $.get @users_stories
requestRefs = Bacon.fromPromise $.get @reference_stories

success = (d, s) -> s == "success"
fetchFailure = requestData.map(success).not()
    .merge(requestRefs.map(success).not())
fetchFailure.onValue => alert "Failed to download" 

【问题讨论】:

    标签: javascript jquery ajax coffeescript bacon.js


    【解决方案1】:

    我认为,您应该使用流对象的错误回调,而不是寻找状态文本。 For example,合并请求并处理任何错误(JS,抱歉,我不熟悉 Coffee Script):

    requestData.merge(requestRefs).onError(function(e) {
        alert("Failed to download: " + e.responseText);
    });
    

    或者,您可以使用mapError 函数将错误事件合并到可观察流中:

    requestData.merge(requestRefs).mapError(function(e) {
        return e.statusText;
    }).onValue(function(next) {
        if (next.feed) {
            // handle feed
        } else {
            alert("Error: " + next);
        }
    });
    

    Fiddle

    编辑

    您可以从fromPromise source 看到对“数据”对象的任何引用都被吞没了。 fromPromise 所做的所有承诺都是将 observable 的处理程序绑定到 promise.then 的“已解决”和“已拒绝”回调:

    Bacon.fromPromise = function(promise, abort) {
        return Bacon.fromBinder(function(handler) {
          promise.then(handler, function(e) {
            return handler(new Error(e));
          });
          return function() {
            if (abort) {
              return typeof promise.abort === "function" ? promise.abort() : void 0;
            }
          };
        }, function(value) {
          return [value, end()];
        });
      };
    

    换句话说,您可以访问状态文本的唯一方法是保存对 Promise 对象的引用。但你不需要这样做——你只需要处理培根的observable.onError

    【讨论】:

    • 很公平。依赖 Bacon 的错误处理,而不是我自己处理一系列可能的错误情况,这似乎不太,嗯,bacony。
    猜你喜欢
    • 2013-11-22
    • 2020-04-04
    • 2022-01-21
    • 1970-01-01
    • 2013-09-23
    • 2013-01-29
    • 2017-04-29
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多