将承诺绑定到函数
Binding a promise to a function
我一直在尝试向函数添加一个承诺,以便它首先等待函数完成。我试过 $.when
和 .promise()
以及添加一个计数器和一个在 .map 函数完成时更改的变量,但我无法让 checkInput()
函数完成并更改在 if 语句执行之前 x、inputSmartCheck
和 inputTNACheck
的值。因此,即使 checkInput()
将 x 的值更改为 1,if 语句也会在这发生之前执行并且 returns 为真。我对 Javascript
有一点经验(我更喜欢 jQuery
),但我认为我正在冒险进入高级领域。任何帮助将不胜感激。
$(document).on("click", ".updateNewRows", function(){
$("#inputTNACheck").val("0"); //hidden inputs
$("#inputSmartCheck").val("0"); //hidden inputs
var x=0;
checkInput();
if(x==0 && $("#inputTNACheck").val()=="0" && $("#inputSmartCheck").val()=="0"){
$(".newStart").each(function () {
var get = $(this).closest(".newStart");
var data = {
empID:get.find(".tna_id").val(),
smart:get.find(".smart_uname").val(),
first:get.find(".f_name").val(),
last:get.find(".l_name").val(),
date:get.find(".start_date").val(),
type:get.find(".type").val()
};
$.post('new_user_process_bulk_create_records.php', data, function(data,textStatus) {
console.log(textStatus);
$("#newUsersTable").remove();
$(".updateNewRows").remove();
if ($("#returnUsersTable").html()) {
$("#newUsersRow").html('<div class="alert alert-success">Updated</div>');
}
else{
location.reload();
}
});
});
}
});
function checkInput(){
$('.newStart').map(function () {
var get = $(this).closest(".newStart");
var id = get.find(".tna_id");
var smart = get.find(".smart_uname");
var first = get.find(".f_name");
var last = get.find(".l_name");
var type = get.find(".type");
var smartCheck = $.ajax({
url: "new_user_validate_bulk_upload.php",
type: "POST",
data: {smart:smart.val(), type:'smart'},
success: function(data) {
if(data!="ok"){
$("#inputSmartCheck").val("1");
smart.css('background-color', 'pink');
}
else{smart.css('background-color', 'white');}
}
});
var tnaCheck = $.ajax({
url: "new_user_validate_bulk_upload.php",
type: "POST",
data: {tna:id.val(), type:'tna'},
success: function(data) {
if(data!="ok"){
$("#inputTNACheck").val("1");
id.css('background-color', 'pink');
}
else{id.css('background-color', 'white');}
}
});
$.when(smartCheck, tnaCheck).then(function() {
var name = new RegExp('^[a-zA-Z-]{0,20}$');
var smartID = new RegExp('^[a-zA-Z0-9]{0,10}$');
var empID = new RegExp('^[0-9]{0,10}$');
if (!name.test(first.val()) || first.val()=='') {
x=1;
first.css('border', '1px solid red');
}else{first.css('border', '1px solid #CCC');}
if (!name.test(last.val()) || last.val()=='') {
x=1;
last.css('border', '1px solid red');
}else{last.css('border', '1px solid #CCC');}
if(!smartID.test(smart.val()) || smart.val()==''){
x=1;
smart.css('border', '1px solid red');
}else{smart.css('border', '1px solid #CCC');}
if(!empID.test(id.val()) || id.val()==''){
x=1;
id.css('border', '1px solid red');
}else{id.css('border', '1px solid #CCC');}
if(type.val()==''){
x=1;
type.css('border', '1px solid red');
}else{type.css('border', '1px solid #CCC');}
});//$.when close
});
}
先了解一些基础知识...
I cannot get the checkInput() function to complete and change the values of x
x
在您的事件处理程序中定义,因此当您在 checkInputs()
中引用它时,即使它在您的事件处理程序中被 调用 ,它确实除非 checkInputs
函数也在该事件处理程序中定义,否则无法访问在事件处理程序范围内定义的变量。 (在这种情况下,我不建议这样做,这意味着每次事件处理程序运行时您都在创建一个函数,这没什么大不了的,但仍然没有必要。)
before the if statement executes
因为 checkInputs()
做的是异步操作,你不能仅仅依靠调用它而没有某种方法来确定它是否完成。好消息是您在 Promises 方面走在了正确的轨道上。
checkInputs
当前的工作方式,您永远不会知道是否所有异步操作都在您的 if
语句之前完成。让我们着手解决这个问题,使用一些基于您的 checkInputs
函数的示例代码。
function checkInputs() {
// an array to store the async calls
var asyncCalls = [];
// iterate over all the things
// changed to .each() because "each" is for iterating,
// and "map" is for returning a new array
$('.newStart').each(function() {
// get all your variables and stuff
var smartCheck = $.ajax({...});
var tnaCheck = $.ajax({...});
var asyncCallsPromise = $.when(smartCheck, tnaCheck).then(function() {
// do stuff
console.log(arguments);
});
asyncCalls.push(asyncCallsPromise);
});
// the important part, return a promise so you can check
// when checkInputs has processed all the things
return $.when.apply($, asyncCalls);
}
// somewhere else...
checkInputs().then(function() {
console.log('all the calls are done');
// here you can do the things that need to happen after checking the inputs
// e.g. the if statement.
});
希望这个朝着正确方向的小努力能有所帮助
我一直在尝试向函数添加一个承诺,以便它首先等待函数完成。我试过 $.when
和 .promise()
以及添加一个计数器和一个在 .map 函数完成时更改的变量,但我无法让 checkInput()
函数完成并更改在 if 语句执行之前 x、inputSmartCheck
和 inputTNACheck
的值。因此,即使 checkInput()
将 x 的值更改为 1,if 语句也会在这发生之前执行并且 returns 为真。我对 Javascript
有一点经验(我更喜欢 jQuery
),但我认为我正在冒险进入高级领域。任何帮助将不胜感激。
$(document).on("click", ".updateNewRows", function(){
$("#inputTNACheck").val("0"); //hidden inputs
$("#inputSmartCheck").val("0"); //hidden inputs
var x=0;
checkInput();
if(x==0 && $("#inputTNACheck").val()=="0" && $("#inputSmartCheck").val()=="0"){
$(".newStart").each(function () {
var get = $(this).closest(".newStart");
var data = {
empID:get.find(".tna_id").val(),
smart:get.find(".smart_uname").val(),
first:get.find(".f_name").val(),
last:get.find(".l_name").val(),
date:get.find(".start_date").val(),
type:get.find(".type").val()
};
$.post('new_user_process_bulk_create_records.php', data, function(data,textStatus) {
console.log(textStatus);
$("#newUsersTable").remove();
$(".updateNewRows").remove();
if ($("#returnUsersTable").html()) {
$("#newUsersRow").html('<div class="alert alert-success">Updated</div>');
}
else{
location.reload();
}
});
});
}
});
function checkInput(){
$('.newStart').map(function () {
var get = $(this).closest(".newStart");
var id = get.find(".tna_id");
var smart = get.find(".smart_uname");
var first = get.find(".f_name");
var last = get.find(".l_name");
var type = get.find(".type");
var smartCheck = $.ajax({
url: "new_user_validate_bulk_upload.php",
type: "POST",
data: {smart:smart.val(), type:'smart'},
success: function(data) {
if(data!="ok"){
$("#inputSmartCheck").val("1");
smart.css('background-color', 'pink');
}
else{smart.css('background-color', 'white');}
}
});
var tnaCheck = $.ajax({
url: "new_user_validate_bulk_upload.php",
type: "POST",
data: {tna:id.val(), type:'tna'},
success: function(data) {
if(data!="ok"){
$("#inputTNACheck").val("1");
id.css('background-color', 'pink');
}
else{id.css('background-color', 'white');}
}
});
$.when(smartCheck, tnaCheck).then(function() {
var name = new RegExp('^[a-zA-Z-]{0,20}$');
var smartID = new RegExp('^[a-zA-Z0-9]{0,10}$');
var empID = new RegExp('^[0-9]{0,10}$');
if (!name.test(first.val()) || first.val()=='') {
x=1;
first.css('border', '1px solid red');
}else{first.css('border', '1px solid #CCC');}
if (!name.test(last.val()) || last.val()=='') {
x=1;
last.css('border', '1px solid red');
}else{last.css('border', '1px solid #CCC');}
if(!smartID.test(smart.val()) || smart.val()==''){
x=1;
smart.css('border', '1px solid red');
}else{smart.css('border', '1px solid #CCC');}
if(!empID.test(id.val()) || id.val()==''){
x=1;
id.css('border', '1px solid red');
}else{id.css('border', '1px solid #CCC');}
if(type.val()==''){
x=1;
type.css('border', '1px solid red');
}else{type.css('border', '1px solid #CCC');}
});//$.when close
});
}
先了解一些基础知识...
I cannot get the checkInput() function to complete and change the values of x
x
在您的事件处理程序中定义,因此当您在 checkInputs()
中引用它时,即使它在您的事件处理程序中被 调用 ,它确实除非 checkInputs
函数也在该事件处理程序中定义,否则无法访问在事件处理程序范围内定义的变量。 (在这种情况下,我不建议这样做,这意味着每次事件处理程序运行时您都在创建一个函数,这没什么大不了的,但仍然没有必要。)
before the if statement executes
因为 checkInputs()
做的是异步操作,你不能仅仅依靠调用它而没有某种方法来确定它是否完成。好消息是您在 Promises 方面走在了正确的轨道上。
checkInputs
当前的工作方式,您永远不会知道是否所有异步操作都在您的 if
语句之前完成。让我们着手解决这个问题,使用一些基于您的 checkInputs
函数的示例代码。
function checkInputs() {
// an array to store the async calls
var asyncCalls = [];
// iterate over all the things
// changed to .each() because "each" is for iterating,
// and "map" is for returning a new array
$('.newStart').each(function() {
// get all your variables and stuff
var smartCheck = $.ajax({...});
var tnaCheck = $.ajax({...});
var asyncCallsPromise = $.when(smartCheck, tnaCheck).then(function() {
// do stuff
console.log(arguments);
});
asyncCalls.push(asyncCallsPromise);
});
// the important part, return a promise so you can check
// when checkInputs has processed all the things
return $.when.apply($, asyncCalls);
}
// somewhere else...
checkInputs().then(function() {
console.log('all the calls are done');
// here you can do the things that need to happen after checking the inputs
// e.g. the if statement.
});
希望这个朝着正确方向的小努力能有所帮助