Javascript 触发时如何传递参数?
当我的JavaScript运行时,它将调用Javascript 触发时如何传递参数?,javascript,jquery,ajax,triggers,parameter-passing,Javascript,Jquery,Ajax,Triggers,Parameter Passing,当我的JavaScript运行时,它将调用getDoctorComplete函数。当AJAX请求完成时,它将设置a=chelsea。否则,将有一个触发器更改,并将运行$('#dropdown_hosp')。更改(…。在$('#dropdown_hosp')。更改(…,它将调用getspeciality函数。当AJAX请求使用getspeciality函数完成时,我想获取a的值。Iconsole.log它,但它包含一个空字符串。如何解决此问题 var a = ''; $(document).rea
getDoctorComplete
函数。当AJAX请求完成时,它将设置a=chelsea
。否则,将有一个触发器更改,并将运行$('#dropdown_hosp')。更改(…
。在$('#dropdown_hosp')。更改(…
,它将调用getspeciality
函数。当AJAX请求使用getspeciality
函数完成时,我想获取a
的值。Iconsole.log
它,但它包含一个空字符串。如何解决此问题
var a = '';
$(document).ready(function () {
app.getHospital({
areaId: ''
});
app.getDoctorComplete({
doctorId: doctorId,
doctorel: $('#dropdown_doct')
});
$('#dropdown_hosp').change(function () {
var dropdownspecialty = $('#dropdown_spec');
app.getSpecialty({
hospitalId: $('#dropdown_hosp').val(),
apiUrl: 'api',
special: dropdownSpec
});
});
});
app = function () {
function getHospital({
areaId
}) {
// ...
$.ajax({
// ...
success: function (result) {
// ...
},
// ...
}).done(function () {
$('#dropdown_hosp').select2();
});
};
function getSpecialty({
hospitalId,
apiUrl,
special
}) {
// ...
$.ajax({
// ...
}).done(function () {
// test here
console.log(a);
});
};
function getDoctorComplete({
schdoctor_id,
doctorel
}) {
// ...
$.ajax({
// ...
success: function (result) {
// ...
},
// ...
}).done(function () {
// ...
a = 'chelsea';
b = '..';
$('#dropdown_hosp').val(b).trigger('change');
});
};
return {
getSpecialty: getSpecialty,
getDoctorComplete: getDoctorComplete
}
}();
您的问题是,您的
ajax
调用是异步的,因此a
在记录时不会被重新分配。下面是一个解决问题的方法,使用Promise
,创建一个异步函数resolve
,标记该异步函数和的返回值
在该异步函数之后执行以下操作:
var a = '';
$(document).ready(function () {
app.getHospital({
areaId: ''
});
app.getDoctorComplete({
doctorId: doctorId,
doctorel: $('#dropdown_doct')
})
.then(() => { // Add the .then() callback to do something after getDoctorComplete finished
$('#dropdown_hosp').change(function () {
var dropdownspecialty = $('#dropdown_spec');
app.getSpecialty({
hospitalId: $('#dropdown_hosp').val(),
apiUrl: 'api',
special: dropdownSpec
});
});
});
});
app = function () {
function getHospital({
areaId
}) {
return new Promise((resolve, reject) => {
// ...
$.ajax({
// ...
success: function (result) {
// ...
},
// ...
}).done(function () {
$('#dropdown_hosp').select2();
resolve(); // Add resolve
});
});
};
function getSpecialty({
hospitalId,
apiUrl,
special
}) {
return new Promise((resolve, reject) => {
// ...
$.ajax({
// ...
}).done(function () {
// test here
console.log(a);
resolve(); // Add resolve
});
});
};
function getDoctorComplete({
schdoctor_id,
doctorel
}) {
return new Promise((resolve, reject) => {
// ...
$.ajax({
// ...
success: function (result) {
// ...
},
// ...
}).done(function () {
// ...
a = 'chelsea';
b = '..';
$('#dropdown_hosp').val(b).trigger('change');
resolve(); // Add resolve
});
});
};
return {
getSpecialty: getSpecialty,
getDoctorComplete: getDoctorComplete
}
}();
您需要将ajax函数包装成一个承诺
,在done
方法中解析该承诺,并在调用后调用。然后()
,如app.getDoctorComplete(…)。然后(()=>{在调用后在此处执行操作})
。尝试添加回调,可能会有帮助。有没有更简单的方法?因为我的案例很复杂。我担心这会影响others@SuccessMan--理论上可以传递(回调)-函数作为每个函数的参数,并在done
块中调用它。除此之外,我没有想到安全的解决方案。异步代码就是这样工作的,您应该习惯它,因为在处理Ajax请求时,没有办法绕过它(Ajax一词的字面意思是“asynchronous JavaScript and XML”@SuccessMan如果这解决了您的问题,请接受答案并自由投票。如果没有,请提供更多信息。