【发布时间】:2015-03-05 03:51:36
【问题描述】:
我编写了一个插件,它应该从 API 获取错误消息并将它们显示在元素的 HTML 中。我想将它作为一个承诺来实现,以便其他事件可以通过done 或always 回调链接到它。插件的简化版如下所示:
(function( $ ) {
$.fn.flashAlerts = function() {
var deferred = $.Deferred();
var field = $(this);
$.getJSON( "alerts", {})
.done(function( data ) {
// Display alerts
field.html(data['message']);
deferred.resolve();
});
return deferred.promise();
};
}( jQuery ));
使用场景可能如下所示:
$("#myForm").submit(function(e) {
e.preventDefault();
var form = $(this);
// Disable submit button
form.disableSubmitButton();
var serializedData = form.serialize();
var url = form.attr('action');
$.ajax({
type: "POST",
url: url,
data: serializedData
}).fail(function(jqXHR) {
// Display errors on failure
$('#alerts').flashAlerts().done(function() {
// Re-enable submit button
form.enableSubmitButton();
});
});
});
这个想法是强制执行以下操作序列:
- 发布表单。在请求之前,禁用提交按钮。请求完成后,
- 从
alertsapi 获取错误。一旦 那个 请求完成,就会显示错误消息。显示错误消息后, - 重新启用提交按钮。
这段代码似乎可以正常工作,但我不知道延期是否按正确的顺序工作(或者我只是对请求的时间感到幸运)。
那么,我这样做对吗?如何测试延期订单是否符合要求?
【问题讨论】:
-
作为一个快速而肮脏的解决方案,尝试在完成回调的主体中进行控制台日志记录。从那里您也可以检查提交按钮的状态。
-
如果你正在使用一些东西来编写单元测试——比如 jasmine 或 qunit——会有一种更简洁的方法。
-
context的预期值是什么,$.fn.flashAlerts()的返回值?
标签: jquery ajax promise jquery-deferred