@Domenic有一篇关于jQuery延迟对象失败的非常详尽的文章:你错过了Point of Promises.在其中,Domenic突出了jQuery承诺的一些失败,与其他包括Q,when.js,RSVP.js和ES6承诺相比.
我离开了Domenic的文章,认为jQuery承诺在概念上有一个固有的失败.我试图把这个例子放在这个概念上.
我认为jQuery实现有两个问题:
.then方法不可链接换一种说法
promise.then(a).then(b)
Run Code Online (Sandbox Code Playgroud)
jQuery将调用a随后b的时候promise满足.
由于.then在其他promise库中返回一个新的promise,它们的等价物将是:
promise.then(a)
promise.then(b)
Run Code Online (Sandbox Code Playgroud)
另一个问题似乎是异常处理,即:
try {
promise.then(a)
} catch (e) {
}
Run Code Online (Sandbox Code Playgroud)
Q中的等价物是:
try {
promise.then(a).done()
} catch (e) {
// .done() re-throws any exceptions from a
}
Run Code Online (Sandbox Code Playgroud)
在jQuery中,当acatch块失败时异常抛出并出现气泡.在其他承诺中,任何异常a将被传递到.done或.catch或其他异步捕获.如果没有任何promise API调用捕获异常,它就会消失(因此Q最佳实践,例如使用.done释放任何未处理的异常).
上述问题是否涵盖了jQuery实现承诺的问题,还是我误解或遗漏了问题?
编辑 此问题与jQuery <3.0; 从 jQuery 3.0开始,alpha jQuery是Promises/A +兼容的.
我有一个$.ajax承诺,想检查我的(语法上有效)响应是否包含错误,在这种情况下触发被拒绝的状态.
我使用自己的诺言库来轻松处理这些任务.我真的不喜欢jQuery的Promise(缓存)实现及其Deferred对象,可能忽略了一些东西,因为我很少使用它.我认为要走的路只是使用.then(),这似乎相当复杂:
return $.ajax(...).then(function success(response) {
var problem = hasError(response);
if (problem) {
var error = new $.Deferred;
error.reject(problem);
return error;
} else
return response;
});
Run Code Online (Sandbox Code Playgroud)
这应该返回一个在网络错误或响应问题时被拒绝的承诺.但是回归被拒绝的推迟真的是[唯一|最好|最短]的方式去?
我也会在ajax选项中自己如何处理这些"错误抛出响应处理程序"的帮助,我找不到关于它们的好文档.
免责声明:不,我无法更改服务器响应.问题检测方法是同步的.我不想使用其他库,我对jQuery解决这个问题的方式特别感兴趣.
$.when 为同时查询的所有多个ajax调用返回Deferred对象.
如果一切都成功.done()执行,并且任何一个url .fail()执行失败.
如何处理部分成功状态?(即)如果传递5个url $.when,如果3个成功,我们需要处理成功状态,并且2失败,我们需要处理失败状态.
$.when($.getJSON(headerUrl), $.getJSON(tasksUrl), $.getJSON(testingTrackerUrl), $.getJSON(highlightsUrl)))
.then(function(headerData, tasksData,testingTrackerData,highlightsData) {
printData(headerData, tasksData,testingTrackerData,highlightsData);
})
.fail(function(data, textStatus, jqXHR) {
console.error('Got error in '+jqXHR);
});
Run Code Online (Sandbox Code Playgroud)