一個Js方法作用域的問題
今天工作中遇到一個BUG.
js方法ajax驗證名字是否存在,存在就不繼續發post請求。
之前錯誤的程式碼:
function isRoleExists() {
$.ajax({
url: '@Url.Action("IsRoleExists")',
type: "GET",
cache: false,
data: { "roleName": $("#RoleName").val(), "selfName": "" },
success: function (data) {
if (data == "True") {
alert('Role had already exists !');
$("#RoleName").addClass("input-validation-error");
return true;
}
else {
$("#RoleName").removeClass("input-validation-error");
return false;
}
}
});
}
//3.validate exists or not
if (isRoleExists()) {
return false;
}
//4.ajax post, if not exists and form is validate
addRole();
錯誤原因,在$.ajax方法的success方法中return,影響的是ajax方法是否進行下一步,返回值的作用域是ajax方法。
函式isRoleExists,所以isRoleExists函式始終返回undifined, ajax返回返回true或false不會影響到它。所以語句if (isRoleExists()) {始終為false,走不到return false語句,所以儘管提示名稱已經存在,還是發post請求了。修改後的方法:
function isRoleExists() {
var _flag = true;
$.ajax({
url: '@Url.Action("IsRoleExists")',
type: "GET",
cache: false,
data: { "roleName": $("#RoleName").val(), "selfName": "@Model.RoleName" },
success: function (data) {
if (data == "True") {
alert('Role had already exists !');
$("#RoleName").addClass("input-validation-error");
}
else {
$("#RoleName").removeClass("input-validation-error");
flag= false;
}
}
});
return _flag;
}
這樣,當名稱存在時候,最終返回的_flag值為ture時,if (isRoleExists()) {語句為ture,執行return false語句,不會去發post請求。
發現有bug,不重複的也不能提交。原因是ajax scucess執行時間要晚,return語句不等ajax執行完,就執行了。
function isRoleExists() {
var _isExists = true;
$.ajax({
url: '@Url.Action("IsRoleExists")',
type: "GET",
cache: false,
data: { "roleName": $("#RoleName").val(), "selfName": "" },
success: function (data) {
if (data == "True") {
alert('Role had already exists !');
$("#RoleName").addClass("input-validation-error");
}
else {
$("#RoleName").removeClass("input-validation-error");
_isExists = false;
}
$("#sp1").html("ajax call time :Second:" + new Date().getSeconds() + " ,Millisecond:" + new Date().getMilliseconds());
}
});
$("#sp2").html("fun call time :Second:" + new Date().getSeconds() + " ,Millisecond" + new Date().getMilliseconds());
return _isExists;
}
結果:ajax call time :Second:30 ,Millisecond:642 fun call time :Second:30 ,Millisecond614
注意,注意
相關文章
- js中變數作用域問題JS變數
- 請問一下jsp;useBean中request作用域問題JSBean
- js的作用域、作用域鏈JS
- JS-作用域題目JS
- js的作用域和作用域鏈JS
- js的作用域與作用域鏈JS
- JS的作用域JS
- 「譯」一個案例搞懂 Vue.js 的作用域插槽Vue.js
- Shell變數的作用域問題變數
- js 作用域和作用域鏈JS
- js作用域JS
- js--執行上下文和作用域相關問題JS
- js -- 跨域問題JS跨域
- js跨域問題JS跨域
- JS-作用域JS
- JS中的跨域問題JS跨域
- JS語法作用域與詞法作用域JS
- web前端學習教程分享:作用域的問題Web前端
- JS 事件迴圈,閉包,作用域鏈題JS事件
- js作用域(變數提升,預解析)例題JS變數
- 從自定義一個作用域開始來了解SpringBean的作用域SpringBean
- JS變數作用域JS變數
- js 的詞法作用域和 thisJS
- js資源跨域訪問的問題JS跨域
- 解決JS跨域訪問的問題JS跨域
- 關於JS中for迴圈時,作用域問題和this指標指向的總結JS指標
- 變數、作用域和記憶體問題變數記憶體
- 對js中執行環境、作用域和作用域鏈的理解JS
- 詳解JS跨域問題JS跨域
- js作用域的常見錯誤JS
- 變數的作用域--js閉包變數JS
- JS進擊之路:作用域JS
- JS作用域與閉包JS
- JS閉包作用域解析JS
- angularJS獨立作用域AngularJS
- 搞懂:前端跨域問題JS解決跨域問題VUE代理解決跨域問題原理前端跨域JSVue
- js基礎梳理-如何理解作用域和作用域鏈?JS
- 使用React Hooks你可能會忽視的作用域問題ReactHook