如何在Bacon.js中获取Ajax调用的状态?

时间:2013-10-13 22:34:30

标签: javascript jquery ajax coffeescript bacon.js

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" 

1 个答案:

答案 0 :(得分: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