【发布时间】:2017-12-11 19:12:07
【问题描述】:
如果我的 Ajax 调用不成功,我想显示一条错误消息。很简单,但我无法修改 Ajax 函数。我创建了一个 onClick 监听器,当我的 AJAX 调用成功时它会做一些事情。我只想在通话不成功的时候做点什么。
所以如果我决定添加:
if (xhr.status !== 200) {
//Error Message here
}
它会放在哪里?
我的html是:
<div id="test-form">
<h2>Add a User:</h2>
<label for="Username:">
<input id="username" type="text" name="username" placeholder="Type username here">
</label>
<label for="Email:">
<span id='result'></span>
<input id="email" type="email" name="email" placeholder="email">
</label>
<button id="myButton">add user</button>
<h2 class="clear">Users:</h2>
<ul id="users"></ul>
</div>
我的代码是:
var el = document.getElementById("myButton");
el.onclick = function() {
addUser(username, email, onSuccess);
}
function onSuccess(result){
var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
var username = document.getElementById("username").value;
var email = document.getElementById("email");
var message = document.getElementById("result").classList;
document.getElementById("users").innerHTML+= '<li>' + username +'</li>';
if (!filter.test(email.value)) {
document.getElementById('result').innerHTML+='Not a valid email';
email.focus;
return false;
} else {
message.add("hide");
}
}
// Do not modify this function. Add user service wrapper.
function addUser(username, email, callback) {
var xhr = new XMLHttpRequest();
var response;
var success = (!!Math.round(Math.random()));
if (!success){
response = JSON.stringify({
success: success,
error: "Oups, something went wrong!"
});
} else {
response = JSON.stringify({
success: success,
user: {
username: username,
email: email
}
});
}
xhr.open("POST", "/echo/json/");
xhr.onload = function () {
if (xhr.status === 200) {
callback(JSON.parse(xhr.responseText));
}
}
xhr.send("json=" + response);
};
【问题讨论】:
-
所以不允许修改“addUser”功能?在这种情况下,您会有点卡住,因为它没有费心处理错误情况。当出现错误(即非 200 响应)时,您需要修改 xhr.onload 回调以实际执行某些操作。
-
如果这是最简单的解决方案,为什么不允许您修改此功能?如果您所做的只是添加一些额外的错误处理功能,您将不会破坏依赖它的其他代码。
-
@Mariton 您基本上无法从 addUser() 函数外部的代码中为 ajax 调用分配侦听器,因为由于变量范围,您无法访问该函数内的 XHR 对象并且不会被它暴露。有人评论了以下关于解决方案的答案之一:stackoverflow.com/questions/5202296/… 这是一个可能的解决方法,涉及弄乱 XHR 原型对象。这可能已经差不多了。
-
@SamOnela 而且,如果您阅读了这个问题,OP 会询问在哪里放置一些代码来检查状态是否为 not 200,这意味着您的建议不会是特别有用。问题是 OP 说这段代码不能放在 addUser 函数中,这是代码中
xhr对象实际上在范围内并且可以像这样访问的唯一位置。换句话说,问不可能。 -
@Mariton:环顾四周后,似乎在其他 cmets (stackoverflow.com/questions/5202296/…) 上发布的链接可能是您最后的希望。修改 JavaScript 本身使用的 XHR 对象似乎有点冒险,但在架构上这个概念至少是合理的。由于您无法修改代码,因此您需要修改代码所使用的依赖项。
标签: javascript ajax