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"
答案 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);
}
});
修改强>
您可以从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
。